Function 如何创建一个函数,允许我在列表中存储值?
我需要创建一个python函数,它将递归地将fibonacci值存储在一个列表中,然后将该列表返回给我。然后,我可以打印那个列表。这是我的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
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]