Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C程序:如何读取这个递归程序_C - Fatal编程技术网

C程序:如何读取这个递归程序

C程序:如何读取这个递归程序,c,C,这段代码让我迷惑不解,读了这个程序谁能告诉我这个程序是如何运行的 #include<stdio.h> int box(int a, int b){ if(a>b) { return 1 +box(a-1, b); } else if(a<b) { return 1 + box(a,b-1); } else { return a+b; } } int m

这段代码让我迷惑不解,读了这个程序谁能告诉我这个程序是如何运行的

#include<stdio.h>

int box(int a, int b){
    if(a>b)
    {
        return 1 +box(a-1, b);
    }
    else if(a<b)
    {
        return 1 + box(a,b-1);
    }
    else
    {
        return a+b;
    }
}
int main(){

    printf("%d", box(12,17));
    return 0;
}
#包括
整数框(整数a,整数b){
如果(a>b)
{
返回1+盒(a-1,b);
}

否则如果(a我们可以添加一些
printf
调用来查看发生了什么:

#包括
整数框(整数a、整数b、整数深度){
++深度;
如果(a>b){
printf(“%s:depth=%d,%d>%d\n”,“函数,深度,a,b”);
printf(“返回1+%s(%d-1,%d)\n”,uu func_uu,a,b);
返回1+框(a-1,b,深度);
}
否则如果(a
输出

框:深度=1,12<17
返回1+框(12,17-1)
框:深度=2,12<16
返回1+框(12,16-1)
方框:深度=3,12<15
返回1+框(12,15-1)
框:深度=4,12<14
返回1+框(12,14-1)
方框:深度=5,12<13
返回1+框(12,13-1)
框:深度=6,12=12
返回12+12
29
解释

程序遵循
a
路径,直到
a=12
b=12
。然后返回
12+12
。最终值为

24+1+1+1+1+1=29
注意


我修改了
以接受
深度
参数。使用
静态
变量可能导致
深度
值不正确。

这是一个递归函数

首先注意重现性的“停止条件”。这里是a==b(最后一个),因此函数返回a+b

第二件事请记住,调用堆栈以及a和b的值在每个调用级别都是正确的

如果a 示例:框(2,4)


方框(2,4)==1+方框(2,3)==1+(1+方框(2+2))==(1+(1+(2+2)))

其他答案指出了这种代码的一种方法是查看基本情况。 这种情况下,不会进行递归调用(在调用
box
时调用
box
)。 必须有一个或所有调用将调用
,您将得到此站点命名的错误-堆栈溢出

通过观察if-else链,我们可以看到如果a>b,它会递归调用,如果ab,我们返回n+b+b,但那只是a+b。 通过类似的论证,如果b>a,我们也会这样做

该函数是一种计算a+b的循环方法,通过将较大的变量减少1,并(实际上)合计我们减少了多少,以得到较小的变量

最重要的一点是,当面对递归函数时,使用一些基本情况(这里A==b)研究(并测试)它,然后处理一些递归一次、再递归两次的情况,依此类推,直到模式变得清晰为止

根据我的经验,当您研究或构建递归函数时,您应该:

  • 测试基本情况。没有递归/
  • 测试一次递归的案例
  • 然后测试递归两次的用例
  • 然后开始测试反复出现几次(4,5)或更多(8,15)的案例
  • 最后测试一些反复出现几十次的怪物
  • 您可以将测试的递归深度以指数形式增加,每次大约增加一倍,并且只需完成少量测试

    (*)确定递归函数的功能通常需要理解“归纳”,因为递归函数本质上是一种递归关系。 如果你的数学背景不包括减法,我推荐一本快速入门

    是的,我知道他们告诉过你计算机科学不要求你擅长数学。他们撒了一点谎。你需要一些

    下面是一个玩具单元测试,它确认了框(a,b)=a+b

    #包括
    整数框(整数a,整数b){
    如果(a>b)
    {
    返回1+盒(a-1,b);
    }
    
    否则,如果(a首先执行主

    int main(){
        printf("%d\n", **box(12, 17)**); //this functions calls
        return 0;
    }
    
    第一次迭代 我们知道a=12和b=17

    int框(int a,int b){
    如果(a>b)
    {
    返回1+盒(a-1,b);
    }
    否则如果(ab)
    {
    返回1+盒(a-1,b);
    }
    否则如果(ab)
    {
    返回1+盒(a-1,b);
    }
    否则如果(ab)
    {
    返回1+盒(a-1,b);
    }
    否则如果(ab)
    {
    返回1+盒(a-1,b);
    }
    否则如果(ab)
    {
    返回1+盒(a-1,b);
    }
    
    else if(a
    box()
    函数将返回a和b的和。如果a!=b,该函数将递归| a-b |次。在每次迭代中,向最终和添加一次以弥补减量,从而最终建立等式并终止递归(a==b)你为什么要声明
    深度
    静态?非常感谢你的解释:)非常感谢你的解释:)非常感谢你的解释:)非常感谢你的解释:)非常感谢你的解释:)
    int box(int a, int b){
        if(a>b) 
        {
            return 1 +box(a-1, b);
        }
        else if(a<b) **// this will be execute**
        {
            return 1 + box(a,b-1); //now b=16 and return has 1
        }
        else
        {
            return a+b;
        }
    }
    
    
    int box(int a, int b){
        if(a>b) 
        {
            return 1 +box(a-1, b);
        }
        else if(a<b) **// this will be execute**
        {
            return 1 + box(a,b-1); //now b=15 and return has 1+1
        }
        else
        {
            return a+b;
        }
    }
    
    
    int box(int a, int b){
        if(a>b) 
        {
            return 1 +box(a-1, b);
        }
        else if(a<b) **// this will be execute**
        {
            return 1 + box(a,b-1); //now b=14 and return has 1+1+1
        }
        else
        {
            return a+b;
        }
    }
    
    
    int box(int a, int b){
        if(a>b) 
        {
            return 1 +box(a-1, b);
        }
        else if(a<b) **// this will be execute**
        {
            return 1 + box(a,b-1); //now b=13 and return has 1+1+1+1
        }
        else
        {
            return a+b;
        }
    }
    
    
    int box(int a, int b){
        if(a>b) 
        {
            return 1 +box(a-1, b);
        }
        else if(a<b) **// this will be execute**
        {
            return 1 + box(a,b-1); //now b=12 and return has 1+1+1+1+1
        }
        else
        {
            return a+b;
        }
    }
    
    
    int box(int a, int b){
        if(a>b) 
        {
            return 1 +box(a-1, b);
        }
        else if(a<b) **// this will be execute**
        {
            return 1 + box(a,b-1); 
        }
        else
        {
            return a+b; *//as we know a=12 and b=12  and return has 1+1+1+1+1 so total is 28*
        }
    }