说说回溯

134 阅读2分钟

说说回溯

回溯的流程

还是以那个最简单1100的累加为例

def f(x):
    global sum
    sum = 0
    if x == 0:
        print 'x is %d and return' %(x)
        return 0
    else:
        print 'before call rec x:%d  sum:%d' %(x,sum)

        sum = f(x - 1) + x
        print 'after called rec x:%d  sum:%d' %(x,sum)
        #sum = sum - 1
        print "traceback:%d" %(x)
        return sum
print '----'
print(f(3))
print '-----'


---- 执行输出结果


----
before call rec x:3  sum:0
before call rec x:2  sum:0
before call rec x:1  sum:0
x is 0 and return
after called rec x:1  sum:1
traceback:1
after called rec x:2  sum:3
traceback:2
after called rec x:3  sum:6
traceback:3
6
-----

Process finished with exit code 0

我们可以看出13call rec是递归调用函数,参数值x从3递减至0,但traceback是从13。

可以看到回溯的语句是位于递归函数        sum = f(x - 1) + x 后面执行,回溯

利用回溯递减

def f(x):
    global sum
    sum = 0
    if x == 0:
        print 'x is %d and return' %(x)
        return 0
    else:
        print 'before call rec x:%d  sum:%d' %(x,sum)

        sum = f(x - 1) + x //回溯前的函数逻辑
        print 'after called rec x:%d  sum:%d' %(x,sum)
        sum = sum - x  //回溯处理逻辑
        print "traceback x:%d" %(x)
        print "during the traceback subtract x:%d, sum :%d" %(x,sum)

        return sum
print '----'
print(f(3))
print '-----'

---- 执行结果

----
before call rec x:3  sum:0
before call rec x:2  sum:0
before call rec x:1  sum:0
x is 0 and return
after called rec x:1  sum:1
traceback x:1
during the traceback subtract x:1, sum :0
after called rec x:2  sum:2
traceback x:2
during the traceback subtract x:2, sum :0
after called rec x:3  sum:3
traceback x:3
during the traceback subtract x:3, sum :0
0
-----


可以看出递归函数调用到0后开始回溯时,sum值其实每次都是有值的,分别是123,但同时因为我们在回溯时加了sum= sum -x 的逻辑,所以相当于
先+x 后-x,所以最终结果是0


我这边稍微改一下代码,我要在回溯时每次只减1 ,最终结果应该是3
1-1+2-1+3-1=3,看下代码和结果如下


def f(x):
    global sum
    sum = 0
    if x == 0:
        print 'x is %d and return' %(x)
        return 0
    else:
        print 'before call rec x:%d  sum:%d' %(x,sum)

        sum = f(x - 1) + x
        print 'after called rec x:%d  sum:%d' %(x,sum)
        sum = sum - 1
        print "traceback x:%d" %(x)
        print "during the traceback subtract x:%d, sum :%d" %(x,sum)
        #sum = sum - x

        return sum
print '----'
print(f(3))
print '-----'



====================输出结果=============

----
before call rec x:3  sum:0
before call rec x:2  sum:0
before call rec x:1  sum:0
x is 0 and return
after called rec x:1  sum:1
traceback x:1
during the traceback subtract x:1, sum :0
after called rec x:2  sum:2
traceback x:2
during the traceback subtract x:2, sum :1
after called rec x:3  sum:4
traceback x:3
during the traceback subtract x:3, sum :3
3
-----