概述
怎么样?:
def fibonacci(n, a=0, b=1):
if a >= n : return [a]
return [a] + fibonacci(n,b,a+b)
[编辑]以下是它的工作原理:
该函数通过向下一次调用自身的结果添加一个元素[a]来逐步构建数组。
第一行允许它在达到目标时停止。没有它,函数的第二行将继续调用自身,并且永远不会有来自递归的结果。
因为函数的参数对于每个调用都是本地的,所以第二次调用中a和b的值与之前的调用不同。
如果我们遵循斐波那契(7)的逻辑,我们得到:
1)斐波纳契(n = 7,a = 0,b = 1)==>将返回[0] +斐波那契(7,1,1)。
2)斐波那契(n = 7,a = 1,b = 1)==>将返回[1] +斐波那契(7,1,2)。
3)斐波那契(n = 7,a = 1,b = 2)==>将返回[1] +斐波那契(7,2,3)。
4)斐波那契(n = 7,a = 2,b = 3)==>将返回[2] +斐波那契(7,3,5)。
5)斐波纳契(n = 7,a = 3,b = 5)==>将返回[3] +斐波那契(7,5,8)。
6)斐波纳契(n = 7,a = 5,b = 8)==>将返回[5] +斐波那契(7,8,13)。
7)斐波那契(n = 7,a = 8,b = 13)==> 8> = 7,因此第一行返回[8]
此时不再有递归调用(第一行返回而不再调用该函数)并且返回值开始重新开始。
7)返回[8]
6)返回[5,8]
5)返回[3,5,8]
4)返回[2,3,5,8]
3)返回[1,2,3,5,8]
2)返回[1,1,2,3,5,8]
1)返回[0,1,1,2,3,5,8]
考虑递归函数的一种方法是仅查看要对先前参数值生成的结果执行的增量工作。大多数情况下,这部分逻辑向后应用(即根据前一个计算最终结果)。例如,阶乘可以被认为是数字与前一数字的阶乘的乘积。
这相当于第二行。
一旦你失败了,你需要决定的是使递归停止的条件。通常这对应于最小/最简单的用例。例如,当数字小于2时,factorial不需要递归,因此函数可以直接返回1。
这相当于第一行。
正如您在上面的跟踪中所看到的,该函数将继续“前进”,但实际上最终会在完成该过程之前等待自身的结果(具有不同的参数)。这就是递归函数的工作原理。最终结果通常是在返回值从多个自调用堆栈中恢复时构建的。
您的斐波纳契函数比因子更复杂,因为该序列只能从原始(0,1)值计算。与阶乘不同,我们没有足够的信息来根据提供的参数(n)计算出a和b的值。
而且,如果你想在神秘的代码中沾沾自喜,这是一个单行版本:
def fibo(n,a=0,b=1):return [a]+fibo(n,b,a+b) if a < n else [a]
最后
以上就是无心白云为你收集整理的python返回值和while循环_Python -While循环递归的全部内容,希望文章能够帮你解决python返回值和while循环_Python -While循环递归所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复