C递归中的魔法?谁能解释一下?
Magic in C recursion? who can explain?
有人可以向我解释一下这个递归是如何工作的吗?
当递归仅在 a == b
并且它是 a = 6
和 b = 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
我猜这令人困惑的方面是明显缺少某种循环语句。即 for
或 do while
声明。
在程序的最后这样想。
return A + MISTERO(A+1, B) /* IS THE LOOP STATEMENT */
它会导致程序从函数 MISTERO (A, B)
中调用函数 MISTERO (A , B)
。因此,只要发生这种情况,您就会绕过一个循环的方式。直到在语句testif(A == B)
中满足循环。然后循环被转义为一个简单的return A
。
感谢享受编程!!!
有人可以向我解释一下这个递归是如何工作的吗?
当递归仅在 a == b
并且它是 a = 6
和 b = 6
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
我猜这令人困惑的方面是明显缺少某种循环语句。即 for
或 do while
声明。
在程序的最后这样想。
return A + MISTERO(A+1, B) /* IS THE LOOP STATEMENT */
它会导致程序从函数 MISTERO (A, B)
中调用函数 MISTERO (A , B)
。因此,只要发生这种情况,您就会绕过一个循环的方式。直到在语句testif(A == B)
中满足循环。然后循环被转义为一个简单的return A
。
感谢享受编程!!!