简单递归方程

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
> 

以上是关于简单递归方程的主要内容,如果未能解决你的问题,请参考以下文章

如何解决方程上的递归树问题

关于递归和动态规划的简单理解

nodejs常用代码片段

Java基础之方法的调用重载以及简单的递归

(算法专题)使用常微分方程将递归转换为非递归

JavaSE 方法的使用