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
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报