问答详情
源自:5-8 递归函数(二)

谁能给个详细的解释,真的没懂

那个递归函数到底咋样运行的?

提问者:黄锋 2015-07-11 00:06

个回答

  • 幻蓝星空
    2015-07-12 14:12:42
    已采纳

    递归函数就是将在自己方法本身调用自身,可以举个生活中的小例子

    例如某天,一个老师让他拿着一堆数字开片,他给自己的学生每个人一张,,老师只要求大于等于0的人来按顺序排队,他将一个50给了第一个人,然后要求比他小10的人站出来,之后要求比前一个(就是50-10,拿到40的人)小10的人站出来,然后再出来一个比上一个小10的人出来,以此类推,直到有拿到了0的站出来,那么这一队当中就有了

    50,40,30,20,10,0这几数字的持有者,老师要求大于等于0的人就是这个递归的结束语句,因为只要求大于等于0的,最后一个是0,比他小10的人肯定不大于他,所以递归结束

    int getSum(int n);    //定义方法
    int main()    //主函数,程序入口
    {
        int i = getSum(50);    //定义一个变量用于接收getNum方法的返回值
        printf("这几个人手中的卡片总和为%d\n",i);
    }
    int getSum(int n)    //刚刚定义了getSum方法,这里是具体实行
    {     //这两个方法中的 i 都是在方法中定义,为局部变量,所以互不干扰
        if(n > 0)
        {
            int i = getSum(n-10) + n;  //以下进行详细解析,解析代码不符合标准写法,只是形式相同
            return i;
         }
         return 0;//在n的值小于0以前不执行这个
    }

    这个代码它的实际流程是这样,主函数还是上面那个,不写了

    int getSum(int n) //主函数调用时传入实参给此形参,实参值为50,所以这个形参也就是50
    {                 // 1 刚刚调用了本方法,并且传入了40,往下执行
                      // 2 刚刚调用了本方法,并且传入了30,往下执行
                      // 3 刚刚调用了本方法,并且传入了20,往下执行
                      // 4 刚刚调用了本方法,并且传入了10,往下执行
                      // 5 刚刚调用了本方法,并且传入了0,往下执行
                     
         if(n > 0)    //步骤 5 的值是 0 ,一个数是不大于自身的,所以 0 不大于 0,不满足,if当中的不执行
         {
             int i = getSum(n - 10) + n; //此处传入n - 10,也就是将40传入,然后调用本方法,步骤 1
                                         //执行到此说明 n 还是大于0,将40-10传入调用本方法,步骤2
                                          //执行到此说明 n 还是大于0,将30-10传入调用本方法,步骤3
                                          //执行到此说明 n 还是大于0,将20-10传入调用本方法,步骤4
                                          //执行到此说明 n 还是大于0,将10-10传入调用本方法,步骤5
                                          //由于步骤5传入的值是0,不满足if判断,所以没法在执行这里
                                          
                                          //接收到步骤 5 所返回的值,执行 i = 0 + n,此处的 n 为10 ,然后执行return返回 0+10 结果给调用步骤4的方法
                                          //接收到步骤 4 所返回的值,执行 i = 10 + n,此处的 n 为20 ,然后执行return返回 10 + 20 结果给调用步骤3的方法
                                          //接收到步骤 3 所返回的值,执行 i = 30+ n , 此处的 n 为30,然后执行return返回 30 + 30 结果给调用步骤2的方法
                                         //接收到步骤 2 所返回的值,执行 i = 60 + n , 此处的 n 为 40,然后执行return返回 60 + 40 结果给调用步骤1的方法
                                         //接收到步骤 1 所返回的值,执行 i = 100 + n , 此处的 n 为 50,然后执行return返回 100 + 50 结果给main方法
             return i;                    
             
         }
         return 0; //返回一个值给刚刚调用步骤 5 的方法
    }

    用起来没觉得的,说起来真乱,我想不到通俗的解释,如果觉得太乱了就别看了,免得被我误人子弟。。。


  • 没头脑0
    2015-08-15 11:15:27

    好厉害,程序猿我敬你

  • 黄锋
    2015-07-12 16:43:15

    你说的更加复杂,不过你学的很好啊,大神