我在例如factorial的例子中“学习”了递归,其中递归调用一直向下返回一个等价的数学函数,通过每次返回计算备份。
与使用out参数存储计算方式相比,这看起来更优雅和可证明。
具体来说,python中两种方法的优缺点是什么?
编辑:
我原来的问题含糊不清,所以我在下面添加了不同风格的例子。
def factorial_1(x):
def helpFactorial_1(x,out):
if x==1:
return out
else:
return helpFactorial_1(x-1,x*out)
return helpFactorial_1 (x,1)
VS
def factorial_2(x):
if x==1:
return 1
else:
return x*factorial_2(x-1)
答案 0 :(得分:0)
虽然我不是 Python 程序员,但你的第二个版本对我来说显然更好。它既短又简单,因为它使用了一半的变量和函数。假设没有tail-call优化,它通过在每个堆栈帧中仅存储一个值而不是两个值来使用更少的内存。即使解释器或编译器将递归转换为循环,第二个版本在概念上的简单性使其更可取。
我认为阶乘不是递归的好练习,因为从一开始就将其作为循环计算并不比作为递归函数更难,对某些人来说甚至更容易。