C递归中的魔法?谁能解释一下?

Magic in C recursion? who can explain?

有人可以向我解释一下这个递归是如何工作的吗? 当递归仅在 a == b 并且它是 a = 6b = 6

时,我被困在结果如何是 20
int main() 
{
    printf("%d \n",mistero(2, 6));
    return 0;
}

mistero( a, b)
{
    if( a == b ){
        return a;
    }
    return a + mistero(a+1, b);
}
mistero(2, 6) =
2 + mistero(3, 6) =
2 + 3 + mistero(4, 6) =
2 + 3 + 4 + mistero(5, 6) =
2 + 3 + 4 + 5 + mistero(6, 6) =
2 + 3 + 4 + 5 + 6
                  = 20

首先你的函数定义必须在你的 main 之前,这样在编译时它在 main 函数中是已知的,否则你必须使用函数原型!

您还忘记定义 return 类型和参数类型。所以你的代码应该看起来像这样才能工作:

#include <stdio.h>

int mistero(int a, int b) {
//^         ^^^----^^^ variable type
//| Here return type

    if( a == b ) {
        return a;
    }

    return a + mistero(a+1, b);
}

int main() {

    printf("%d \n",mistero(2, 6));

    return 0;
}

或者用一个函数原型:

#include <stdio.h>

int mistero(int a,int b);

int main() {

    printf("%d \n",mistero(2, 6));

    return 0;
}


int mistero(int a,int b) {

    if( a == b ){
        return a;
    }

    return a + mistero(a+1, b);
}

这应该说明它是如何工作的:

return 2 + mistero(2 + 1, b);
return 2 + 3 + mistero(3 + 1, b);
return 2 + 3 + 4 + mistero(4 + 1, b);
return 2 + 3 + 4 + 5 + mistero(5 + 1, b);
return 2 + 3 + 4 + 5 + 6;
                         = 20

递归的工作原理如下:

2 + mistero(3,6);

2 + 3 + mistero(4,6)

2 + 3 + 4 + mistero(5,6)

2 + 3 + 4 + 5 + mistero(6,6)

2 + 3 + 4 + 5 + 6  = 20

只需一步步执行代码,将函数调用替换为return值。

首次调用函数时:

return 2 + mistero(3,6);

mistero(3,6) returns 3 + mistero(4,6)

所以 return 语句最终会继续添加到 a==b

return 2+3+4+5+6

我猜这令人困惑的方面是明显缺少某种循环语句。即 fordo while 声明。 在程序的最后这样想。

return A + MISTERO(A+1, B) /* IS THE LOOP STATEMENT */

它会导致程序从函数 MISTERO (A, B) 中调用函数 MISTERO (A , B)。因此,只要发生这种情况,您就会绕过一个循环的方式。直到在语句testif(A == B)中满足循环。然后循环被转义为一个简单的return A。 感谢享受编程!!!