作为一个练习,我试图做一个脚本,它会给我一个列表中的项目的总和,但不使用SUM或FOR/WHILE循环。Python:递归并返回
我结束了与解决它:
3210这种运作良好,并返回“10”,但我最初的做法是:
def addition(data, total=0):
if data != []:
total += data.pop()
addition(data, total)
return total
print(addition([1,2,3,1,2,1]))
和代码返回“1”,第二个位而不是'10'。我无法弄清楚为什么这两种方法没有做同样的事情,或者即使第二个例子在数据= []和总数= 10时进入最后一个循环时出现'1',我猜测我错过了关于变量作用域如何工作的一些规则?
(如下面的答案解释,它有无关变量的作用域,所以我改变了标题,以反映的问题,任何人在将来对这个事情)
这不是真的与你的问题有关(这在下面得到了很好的回答),但是我想补充一点,Python不会为尾递归提供任何好处,所以你可以简化你的函数, '如果data:return data.pop()+ addition(data)'用'else:return 0'作为基本情况。你根本不需要'total'参数,因为实际的加法是和返回值一起发生的。 – Blckknght
嘿@Blckknght,仍然有点新,我想我正在用错误的方式来看递归,但看着你的例子,我想我现在明白了。我更像是一个while循环,其中每个迭代都将被线性处理,并且一个循环的输出将成为下一个输入,直到达到基本情况才能打破循环,但在递归中情况并非如此,是吗?这更像是解开其中的同一表达式,直到达到已知的基本情况,然后从最内层的表达式向外解决所有问题。谢谢你,这有助于 –
@Blckknght '高清谎(数据): 如果数据> 1: 回报FIB(数据-1)+ FIB(数据-2) ELIF数据== 1: 回报1 其他: return 0 print(fib(15))' 是的,有了这个想法,我现在完全明白为什么返回语句也是必要的 –