Recursion 重复加法递归

Recursion 重复加法递归,recursion,Recursion,下面是一段代码,它使用递归(将a的值取为7)生成11的输出。我不知道该怎么做。有谁能解释一下,通过调用自身生成这个输出,函数是如何叠加的 int fun(int a) { if( a <= 1) return a; return fun(a-1) + fun(a-2) + fun(a-3); } intfun(inta) { 如果(a让我们在研究它的工作原理时对此感到有趣。我将替换Pytho

下面是一段代码,它使用递归(将
a
的值取为7)生成11的输出。我不知道该怎么做。有谁能解释一下,通过调用自身生成这个输出,函数是如何叠加的

int fun(int a)
        {
          if( a <= 1)
             return a;
          return fun(a-1) + fun(a-2) + fun(a-3);
        }
intfun(inta)
{

如果(a让我们在研究它的工作原理时对此感到有趣。我将替换Python等效代码,原因将在下一步中介绍:

def fun(a):
    if a <= 1:
        return a

    return fun(a - 1) + fun(a - 2) + fun(a - 3)

b = fun(7)

print(b)
现在有趣的是,我们将对Python代码进行一个小的更改。而不是:

return a
我们将写:

return "+" + str(a)
现在,当我们运行代码时,我们得到:

% python3 test.py
+1+0+-1+1+0+1+0+-1+1+1+0+-1+1+0+1+0+-1+1+0+-1+1+0+1+0+-1+1+1+0+-1+1+0+1+0+-1+1+0+1+0+-1+1+1+0+-1+1+0+1+0+-1+1+0+-1+1+0+1+0+-1+1
%
这让我们了解了它是如何工作的。所有数字最终都会减少到一个-1、0和/或1的序列,这是我们的结果。这三个值都会自我评估,不会进一步扩展。知道:

-1 -> +-1
0 -> +0
1 -> +1
我们可以看到:

2 -> 2-1 2-2 2-3 -> 1 0 -1 -> +1+0-1 -> 0

3 -> 3-1 3-2 3-3 -> 2 1 0 -> (+1+0-1)+1+0 -> 1
依此类推。我们可以通过程序运行6、5和4,并将这些结果连接起来,以获得7的结果:

6 +1+0+-1+1+0+1+0+-1+1+1+0+-1+1+0+1+0+-1+1+0+-1+1+0+1+0+-1+1+1+0+-1+1+0
5 +1+0+-1+1+0+1+0+-1+1+1+0+-1+1+0+1+0+-1
4 +1+0+-1+1+0+1+0+-1+1

7 +1+0+-1+1+0+1+0+-1+1+1+0+-1+1+0+1+0+-1+1+0+-1+1+0+1+0+-1+1+1+0+-1+1+0[ ]+1+0+-1+1+0+1+0+-1+1+1+0+-1+1+0+1+0+-1[ ]+1+0+-1+1+0+1+0+-1+1
最后,我们将在修改后的Python程序末尾添加一行:

print(eval("0" + b))
这将把一串零、一和负一相加成一个数字:

% python3 test.py
+1+0+-1+1+0+1+0+-1+1+1+0+-1+1+0+1+0+-1+1+0+-1+1+0+1+0+-1+1+1+0+-1+1+0+1+0+-1+1+0+1+0+-1+1+1+0+-1+1+0+1+0+-1+1+0+-1+1+0+1+0+-1+1
11
%

这证实了我们是通过对递归产生的所有这些小数字求和得到结果的。

试着用笔和纸跟踪这个函数的执行情况,并展示您所做的工作。谢谢您的努力,伙计!这真的很有帮助。
% python3 test.py
+1+0+-1+1+0+1+0+-1+1+1+0+-1+1+0+1+0+-1+1+0+-1+1+0+1+0+-1+1+1+0+-1+1+0+1+0+-1+1+0+1+0+-1+1+1+0+-1+1+0+1+0+-1+1+0+-1+1+0+1+0+-1+1
11
%