是否存在非递归方式,我可以通过添加最后3个数字来制作"斐波那契"序列?
这是我尝试这样做的递归方式。
def fib3(n):
if n < 3:
return 1
else:
return fib3(n-1) + fib3(n-2) + fib3(n-3)
返回1+1+1+3+5+9+17...+(n-1) + (n-2) + (n-3)
任何帮助将不胜感激。
提前致谢
答案 0 :(得分:5)
是的,非常优雅,具有Python的多重任务能力:
>>> def fib3(n):
... if n < 3:
... return 1
... a = b = c = 1
... for i in range(3, n):
... # We "shift" a, b, and c to the next values of the sequence.
... a, b, c = b, c, (a + b + c)
... return c
...
>>> fib3(4)
3
>>> fib3(5)
5
>>> fib3(6)
9
>>> fib3(7)
17
迭代方法绝对优先于递归方法 - as @mu writes,递归实现的运行时间约为O(3 ^ n),而此方法为O(n)。
答案 1 :(得分:0)
fib_sum计算m最后一个整数:
>>> def fib_sum(n,m):
if n < m:
return "n should be greater than m"
a,b,sumit = 0,1,0
for x in range(n):
print b,
if x >= n-m:
sumit += b
a,b = b,a+b
return sumit
>>> fib_sum(3,4)
'n should be greater than m'
>>> fib_sum(3,2)
1 1 2
3
>>> fib_sum(3,1)
1 1 2
2
>>> fib_sum(2,1)
1 1
1
>>> fib_sum(2,2)
1 1
2
>>> fib_sum(7,2)
1 1 2 3 5 8 13
21
>>> fib_sum(7,3)
1 1 2 3 5 8 13
26
>>> fib_sum(8,6)
1 1 2 3 5 8 13 21
52
>>> fib_sum(8,8)
1 1 2 3 5 8 13 21
54
答案 2 :(得分:0)
我已经到了晚会,但是:人们很容易得出一个公式来得到任何线性递归的第n个元素,比如Fibonacci序列或其泛化,而不必计算所有中间元素。假设你的重现是f [n] = a [1] f [n - 1] + a [2] f [n - 2] + ... + a [m] f [n - m]。假设f [n] =(某些常数)^ n。 (这是一种经常出现在微分方程解决方案中的幸运猜测假设。我不知道如何以先验的方式证明它。通过实际发现这样的事实可以证明这是正当的。常数。)那么常数必须是多项式的根x ^ m - a [1] x ^(m - 1) - a [2] x ^(m - 2) - ... - a [m] 。任何解决方案的线性组合也必须是解决方案。通过求解从前m个值导出的线性系统,可以找到线性组合的系数c [1],...,c [m](显然,序列中所有后面的值的值由第一个确定) m值)。
对于所述的递归f [n] = f [n - 1] + f [n - 2] + f [n - 3],我们得到[1] = a [2] = a [3] = 1和x ^ 3 - x ^ 2 - x - 1的根分别为 - 0.6063%i - 0.4196,0.6063%i - 0.4196,1.839。给出前3个值为1,1,1。求解c [1] + c [2] + c [3] = 1,c [1] a [1] + c [2] a [2] + c [3] a [3] = 1,c [1] a [1] ^ 2 + c [2] a [2] ^ 2 + c [3] a [3] ^ 2 = 1表示c [1 ],c [2],c [3]分别得到0.3592%i + 0.2822,0.2822-0.3592%i,0.4356。 (我把它们写成近似的浮点数。作为具有有理系数的多项式的根,这些是代数数,但精确的表达式可能很容易变得混乱。)
总之,f [n] = c [1] a [1] ^ n + c [2] a [2] ^ n + c [3] a [3] ^ n,具有所述的值a和c,是一个函数,它给出了递归的第n个元素f [n] = f [n - 1] + f [n - 2] + f [n - 3],f [2] = f [1] = f [0] = 1。
我计算了Maxima中的a和c。如果有任何兴趣,我可以更多地谈谈我是如何做到的。