【问题标题】:Correct way to return list of fibonacci sequence using recursion使用递归返回斐波那契序列列表的正确方法
【发布时间】:2021-09-26 06:36:36
【问题描述】:

我了解如何使用迭代方法返回斐波那契数列, 以及动态规划方法。

通过递归,我理解了斐波那契的递归树。 以及如何返回第 N 个斐波那契数

def fib(num):
    if num <= 2: 
        return num 

    return fib(num -1) + fib(num-2)

print(fib(5))

上面的代码返回8,这很棒, 但我想了解如何返回序列列表 通过更新上述递归代码。

eg: [1,1,2,3,5,8]

【问题讨论】:

  • num &lt;= 2 的情况下,您能想出一条规则来告诉您列表应该是什么吗?如果您有第一个 num 斐波那契数列的列表,您能想出一个代码来创建第一个 num+1 斐波那契数列的列表并返回它吗?
  • 斐波那契数列从 1、1、2 开始,因此您的实现永远不会产生数列中的第一个 1。我相信 fib(1) 和 fib(2) 通常都是 1,因此 fib(0) 是 0。使用 fib(0) = 0 和 fib(1) = 1 可能最简单,之后你可以使用递归.所以要修复它,只需将&lt;= 2 更改为&lt;= 1。要返回一个列表,只需创建一个包装函数。但请注意,如果没有记忆,您的递归实现会呈指数级增长,即它是最糟糕的实现。
  • 我可以说 arr = [ -1 ] * num 然后 arr[0] = 0; arr[1] = 1. 然后递归调用 are[num]=fib(num-1) + fib(num-2) 问题是我必须在函数之外声明 arr=[] 有没有办法把它放在函数里面。

标签: python recursion fibonacci


【解决方案1】:

使用以 0 开头的斐波那契数列,我们可以递归地重写您的代码,而无需任何外部数据,方法是:

def fib(index):
    if index <= 2:
        return [0, 1][:index]

    sequence = fib(index - 1)

    sequence.append(sum(sequence[-2:]))

    return sequence

print(fib(11))

输出

> python3 test.py
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>

但是作为@TomKarzes cmets,有更好的算法。但由于您坚持以递归方式执行此操作,因此效率不是主要问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-24
    • 2016-10-31
    • 2011-07-27
    • 1970-01-01
    • 2012-11-19
    • 2021-02-17
    • 2016-11-07
    • 2012-02-16
    相关资源
    最近更新 更多