说说回溯
回溯的流程
还是以那个最简单1到100的累加为例
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
我们可以看出1到3,call rec是递归调用函数,参数值x从3递减至0,但traceback是从1到3。
可以看到回溯的语句是位于递归函数 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值其实每次都是有值的,分别是1,2,3,但同时因为我们在回溯时加了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
-----