简单递归方程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单递归方程相关的知识,希望对你有一定的参考价值。
从C1 = 3,C2 = -2和C3 = -1开始,我需要编写一个代码,它遵循以下公式:
thenextanswer = thelatestanswer + (2 * thesecondanswerback) - (3 * thethirdanswerback)
帮助我更容易理解我用简单的术语写出来:
C4 = C3 + 2*C2 - 3*C1
C5 = C4 + 2*C3 - 3*C2
C6 = C5 + 2*C4 - 3*C3
C7 = C6 + 2*C5 - 3*C4
C8 = C7 + 2*C6 - 3*C5
等等,直到C55
我有如何完成所有递归答案的数学,我只是将它放入python并让python计算它。这是我的代码到目前为止(几乎只是猜测工作和记下基本想法):http://prntscr.com/nbigl5
关于我如何做这个的任何提示/技巧?
答案
我认为这不一定是递归,它看起来像一个开放式表达式
c = [3, -2, -1]
for i in range(3,55): # index starts at 0, 3 <= i < 55
c.append(c[i-1] + (2*c[i-2]) - (3*c[i-3]))
如果它需要递归你可以做类似的事情
def calculate(n):
if n == 1:
c[n] = 3
elif n == 2:
c[n] = -2
elif n == 3:
c[n] = -1
else:
if n-3 in c.keys():
z = c[n-3]
else:
z = calculate(n-3)
if n-2 in c.keys():
y = c[n-2]
else:
y = calculate(n-2)
if n-1 in c.keys():
x = c[n-1]
else:
x = calculate(n-1)
c[n] = x + 2*y - 3*z
return c[n]
c = {}
calculate(55)
print(c)
给出输出:
{1: 3, 2: -2, 3: -1, 4: -14, 5: -10, 6: -35, 7: -13, 8: -53, 9: 26, 10: -41, 11: 170, 12: 10, 13: 473, 14: -17, 15: 899, 16: -554, 17: 1295, 18: -2510, 19: 1742, 20: -7163, 21: 3851, 22: -15701, 23: 13490, 24: -29465, 25: 44618, 26: -54782, 27: 122849, 28: -120569, 29: 289475, 30: -320210, 31: 620447, 32: -888398, 33: 1313126, 34: -2325011, 35: 2966435, 36: -5622965, 37: 7284938, 38: -12860297, 39: 18578474, 40: -28996934, 41: 46740905, 42: -66988385, 43: 113484227, 44: -160715258, 45: 267218351, 46: -394664846, 47: 621917630, 48: -969067115, 49: 1458762683, 50: -2345124437, 51: 3479602274, 52: -5586934649, 53: 8407643210, 54: -13205032910, 55: 20371057457}
编辑:函数进行真正的递归(基于iElden的答案,但是当我运行它时,我没有得到正确的结果,但我做了一些更改,它比我想出的效率更高)
def calc(c3, c2, c1, n, maxn):
result = c3 + 2*c2 - 3*c1
print("n: "+str(n)+" r: "+str(result))
if n == maxn:
return result
else:
return calc(result, c3, c2, n + 1, maxn)
calc(-1, -2, 3, 4, 20)
而我的真正递归,需要很长时间才能计算出来但得到了正确的答案,而且在我看来更接近于递归的精神
def recursive(n):
if n == 1:
r = 3
elif n == 2:
r = -2
elif n == 3:
r = -1
else:
z = recursive(n-3)
y = recursive(n-2)
x = recursive(n-1)
r = x + 2*y - 3*z
print("n: "+str(n)+" r: "+str(r))
return r
recursive(20)
通过C20输出:
n: 4 r: -14
n: 5 r: -10
n: 6 r: -35
n: 7 r: -13
n: 8 r: -53
n: 9 r: 26
n: 10 r: -41
n: 11 r: 170
n: 12 r: 10
n: 13 r: 473
n: 14 r: -17
n: 15 r: 899
n: 16 r: -554
n: 17 r: 1295
n: 18 r: -2510
n: 19 r: 1742
n: 20 r: -7163
另一答案
当你想要做一个递归函数时,首先要做的是定义停止条件。
这里,停止条件是当你的结果是C55时,我将这个变量命名为loop_nb
然后,您必须查看每个步骤之间要传输的内容,此处,您要传输结果和前两个参数。
在代码中它给出了:
def calc(c3, c2, c1, loop_nb):
result = c3 + 2*c2 - 3*c1
if loop_nb == 55:
return result
else:
return calc(result, c3, c2, loop_nb + 1)
calc(-1, -2, 3, 4)
我希望它对你的作业有用!
另一答案
为了回答并总结现有的答案,我们可以通过以下方式使用简单且合理快速的递归a @lElden(+1)和@MatthewK(+1):
def simply_recursive(c1, c2, c3, n=55):
c4 = c3 + 2 * c2 - 3 * c1
if n == 4:
return c4
return simply_recursive(c2, c3, c4, n - 1)
print(simply_recursive(3, -2, -1)) # 20371057457
或者我们可以采用一个较慢的解决方案,通过@MatthewK进行多次递归,并使用缓存加速优化冗余调用:
from functools import lru_cache
@lru_cache()
def massively_recursive(n):
if n == 1:
return 3
if n == 2:
return -2
if n == 3:
return -1
c1 = massively_recursive(n - 3)
c2 = massively_recursive(n - 2)
c3 = massively_recursive(n - 1)
return c3 + 2 * c2 - 3 * c1
print(massively_recursive(55)) # 20371057457
两者的性能大致相同:
> time python3 test1.py
20371057457
0.029u 0.006s 0:00.04 50.0% 0+0k 0+0io 0pf+0w
> time python3 test2.py
20371057457
0.027u 0.006s 0:00.04 50.0% 0+0k 0+0io 0pf+0w
>
以上是关于简单递归方程的主要内容,如果未能解决你的问题,请参考以下文章