1.递归是栈结构,即先进后出,从以下代码打印的结果可以看出;
2.递归中可以使用可迭代变量(如list)作为全局变量,如代码中的path;
3.递归中不能使用不可迭代变量作为全局变量,要实现全局变量只能传参进去,如代码中的sum_,想要让sum_返回出来,可以通过代码中的形式,在backtrack的结束条件中return全局变量sum_,在出栈的时候进行赋值并再次return;
4.会造成2、3的差别是因为python中可迭代变量传入的是引用,不可迭代变量传入的是形参;
def calcNum(n):
def backtrack(n, sum_):
if (n > 5):
return sum_ # !!! return 1
path.append(n)
sum_ += n
n+=1
print('进栈的n:', n)
print('进栈的sum_:', sum_)
sum_ = backtrack(n, sum_) # !!! return 2
print('出栈的n:', n)
print('出栈的sum_:', sum_)
return sum_ # !!! return 3
sum_ = 0
path = []
ret = backtrack(n, sum_)
print('path:',path)
print('ret:',ret)
return ret
print(calcNum(0))
# 进栈的n: 1
# 进栈的sum_: 0
# 进栈的n: 2
# 进栈的sum_: 1
# 进栈的n: 3
# 进栈的sum_: 3
# 进栈的n: 4
# 进栈的sum_: 6
# 进栈的n: 5
# 进栈的sum_: 10
# 进栈的n: 6
# 进栈的sum_: 15
# 出栈的n: 6
# 出栈的sum_: 15
# 出栈的n: 5
# 出栈的sum_: 15
# 出栈的n: 4
# 出栈的sum_: 15
# 出栈的n: 3
# 出栈的sum_: 15
# 出栈的n: 2
# 出栈的sum_: 15
# 出栈的n: 1
# 出栈的sum_: 15
# path: [0, 1, 2, 3, 4, 5]
# ret: 15
# 15
在递归函数中使用global声明全局变量没有效果,会报错说变量没定义,如代码中的sum_:
def calcNum(n):
def backtrack(n):
global sum_
if (n > 5):
return sum_
path.append(n)
sum_ += n
n+=1
print('进栈的n:', n)
print('进栈的sum_:', sum_)
sum_ = backtrack(n)
print('出栈的n:', n)
print('出栈的sum_:', sum_)
return sum_
sum_ = 0
path = []
ret = backtrack(n)
print('path:',path)
print('ret:',ret)
return ret
print(calcNum(0))
# error: sum_未定义