热爱学习的呆萌的文青 2015-12-23 06:57 采纳率: 54.8%
浏览 2347
已采纳

递归问题,求n的阶乘?

图片说明

 int sum2(n) {
    int sum=0;
    if (n<0) printf_s("error\n");
    //else if (n == 0 || n == 1) sum = 1; 
    else sum = sum2(n - 1)*n;
    return sum;
}

上图是将注释的话没有写在程序中的结果,不能理解为什么会是这样。。。

  • 写回答

8条回答 默认 最新

  • lambda-fk 2015-12-23 08:13
    关注

    我给你分析下,你细心看看就明白了。
    递归调用就是不断调用自己。然后结合堆栈的原理进行入栈出栈。
    比如 f(x)进行递归调用 ,在调用处函数中断。函数环境入栈。
    直道有解得时候返回值,中断处得到返回值再进行处理出栈。逐层向上直道最顶层的中断恢复为止。
    你可以认为是不断进行任务分解直道有解得时候返回 .(有解指的是函数能执行完毕不再调用其它函数)
    所以得到调用序列 f1(x),f2(x)........fn(x) {其中fn=f}

    现在我们看你的程序
    写阶乘 n! = n*(n-1)!
    f(x) = x!
    f(n) = n * f(n-1) :函数在f(n-1)中断 fn-1
    f(n-1) = (n-1)*f(n-2) : 函数在f(n-2)中断 fn-2
    ...
    ...
    f(1) = 1 * f(0) : 函数在f(n-2)中断 f0 中断
    这个时候就是关键的步骤。我们要设置 函数的解,不然你可以写出 f(-1),f(-2)....
    也就是我们要设置函数的出口定义。
    既然是出口要写在自身调用的上面,否则先自身调用再出口那么出口就是不可到达。
    一旦定义了出口,就是结束函数调用的时点

    你程序设计的时点是 :

        if (n<0) printf_s("error\n");
    

    你看程序在此时打印出error之后,会执行什么啊? 应该是 return sum巴
    sum是多少阿? 由于你在函数首句定义了sum=0,所以最后一次返回的是0
    这样 导致没层中断的返回值都是0
    所以结果就是0了

    按照上面的分析你可一写出

        if(n==1)
            return 1
            retturn sum2(n - 1)*n
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?