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

时间:2015-01-08 11:52:03

标签: c recursion

有人可以向我解释这种递归是如何工作的吗? 如果递归只留在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);
}

5 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:4)

递归的工作原理如下:

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

答案 2 :(得分:3)

只需逐步执行代码,并用返回值替换函数调用。

首次调用该函数时:

return 2 + mistero(3,6);

mistero(3,6)返回3 + mistero(4,6)

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

return 2+3+4+5+6

答案 3 :(得分:2)

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

您也忘了定义返回类型和参数类型。所以你的代码应该看起来像这样:

#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

答案 4 :(得分:0)

我猜这个令人困惑的方面是明显缺乏某种循环语句。 I.e fordo while声明。 在程序的最后以这种方式考虑它。

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

它使程序从函数MISTERO (A , B)中调用函数MISTERO (A, B)。因此,只要发生这种情况,您就可以获得一个循环方式。在语句test if(A == B)中满足循环之前。然后循环转义是一个简单的return A。 谢谢享受编程!!!