Function 如何创建一个函数,允许我在列表中存储值?

Function 如何创建一个函数,允许我在列表中存储值?,function,Function,我需要创建一个python函数,它将递归地将fibonacci值存储在一个列表中,然后将该列表返回给我。然后,我可以打印那个列表。这是我的 def recFib(x): result = [] if x == 1: return result.append(1) if x == 2: return result.append(2) for i in range(2,x): result.append(recFi

我需要创建一个python函数,它将递归地将fibonacci值存储在一个列表中,然后将该列表返回给我。然后,我可以打印那个列表。这是我的

def recFib(x):
    result = []

    if x == 1:
        return result.append(1)

    if x == 2:
        return result.append(2)

    for i in range(2,x):
        result.append(recFib(i-1)+recFib(i-2))

    return result

我是Python新手,所以很多概念对我来说都是新概念,我似乎无法找出我做错了什么

您的代码存在一些问题,例如:

返回结果。追加(1)

将返回
None
,而不是附加
1
result

而且

def recFib(x):
    result = []
每次调用
recFib
时都会将结果设置为
[]
,我认为这不是您想要的

对不起,我不确定我是否理解你的全部逻辑

一个可能的解决方案如下:

def recFib(x):
    n_to_fib = {0: 0, 1: 1}
    def fib(x):
        if x in n_to_fib:
            return n_to_fib[x]
        temp = fib(x - 1) + fib(x - 2)
        n_to_fib[x] = temp
        return temp

    return fib(x)

if __name__ == "__main__":
    result = [recFib(i) for i in range(8)]

    print result
结果:

[0, 1, 1, 2, 3, 5, 8, 13]
计算新值的速度很快,因为以前的值存储在
n_to_fib
dict中,因此无需重新计算

我们还可以修改
recFib
直接返回列表:

fib(x)
return sorted(n_to_fib.values())
而不是:

return fib(x)

这是一个基于@Akavall的anwer的解决方案

def recFib(x):
    fibArray = [0, 1]
    def fib(x):
        if x < len(fibArray):
            return fibArray[x]
        temp = fib(x - 1) + fib(x - 2)
        fibArray.append(temp)
        return temp

    return fib(x)
def recFib(x):
fibArray=[0,1]
def纤维(x):
如果x
试试这个:

def recFib(n):
    if n == 1:
        return [0]
    elif n == 2:
        return [0, 1] 
    else:
        a = recFib(n-1)
        return a + [a[-1] + a[-2]]
该计划的关键在于:

return a + [a[-1] + b[-1]]

a       # This gets the most recently created list, since it's `recFib(n-1)`
+       # Append to the next list (but does not return `None`)
[ a[-1] # Last value of `recFib(n-1)`, which is the previous value.
+       # Add to
a[-2]]  # Second last value of `recFib(n-1)`, which is the second previous value.
以下是recFib(5)
的断点:

它不需要两个函数。我觉得这有点像作弊:

>>> recFib(20)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]
>>> recFib(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
>>> recFib(19)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584]

通过循环递归函数生成列表效率非常低。每次使用该函数时,您都在重新计算整个序列。

是否假设将这些值附加到结果中?看来你是在另一张“旧”的单子后面,或者我遗漏了什么。我道歉。我修复了它。这个函数运行得很好,但是recFib函数应该返回一个包含n个元素的列表,而不是该列表中的第n个元素。@FrankBessou,我认为这可以通过相当轻微的修改来实现,例如返回
排序(n\u to\u fib.values())
@coding\u xeno你能更具体一点吗?我明白了!非常感谢你的帮助。我现在唯一的问题是。。。我们需要在内部定义另一个函数吗?有没有一种方法我不用做that@coding_xeno伟大的如果您不喜欢嵌套函数,可以使用
FibCalculator
类,其中
self.n\u to\u fib
是一个字段,
self.fib
是其中一种方法。您还可以将
n_to_fib
作为全局变量,但这不是一个好的做法。可能还有其他我没有看到的方法……啊,很好,这很聪明。我试过了,然后在recFib:print(I)中加入了I,但是我无法生成列表,我知道发生了什么。我试着返回排序的(fibArray.values())效果很好!你能解释一下什么是返回a+[a[-1]+b[-1]]does@coding_xeno,请参阅最近的编辑。我还重新编辑了代码。
>>> recFib(20)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]
>>> recFib(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
>>> recFib(19)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584]