递归的具体调用是怎么样的啊?#includestdio.hint jiesheng(int n){int mif(n1)m1elsemjiecheng(n-
递归的具体调用是怎么样的啊?
#include<stdio.h> int jiesheng(int n) { int m; if(n==1) m=1; else m=jiecheng(n-1)*n; return m; void main() { int m,n; printf("input 1 number:"); scanf("%d",&n); m=jiecheng(n); printf("out=%d\n",m); } 这里的具体过程是怎么样的啊? [解决办法] 函数自己调用自己,每次参数值不同而已
[解决办法] 输入一个数值,单步跟踪看看
[解决办法] 比如说输入3。
1.运行void main 中m=jiesheng(n);
2.运行int jiesheng(n) 中m1=jiesheng(3-1)*3;
3.调用2的jiesheng(3-1),在自身调用一次m2=jiesheng(3-1-1)*2;
4.调用3的jiesheng(3-1-1),再自身调用m3=1;
5.m2=m3*2=1*2,m1=m2*3=1*2*3=6.
最后,不必太纠结,自己可以单步调试设置断点
[解决办法] “给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出
[解决办法] 引用: 比如说输入3。 1.运行void main 中m=jiesheng(n); 2.运行int jiesheng(n) 中m1=jiesheng(3-1)*3; 3.调用2的jiesheng(3-1),在自身调用一次m2=jiesheng(3-1-1)*2; 4.调用3的jiesheng(3-1-1),再自身调用m3=1; 5.m2=m3*2=1*2,m1=m2*3=1*2*3=6…… 将jiecheng(n-1)*n一直压栈,当最后一次调用函数参数为1时,逐次出栈操作。
[解决办法] 你把下面的 的函数 在画图 中多粘贴 几份,然后就像多个函数的调用一样执行就可以了。
int jiecheng(int n) { if(n<=1)return 1; return jiecheng(n-1)*n; } [解决办法] 和普通函数的调用是一样的
[解决办法] 用debugger跟踪执行的过程。
[解决办法] debug一下
或者自己在草稿纸上写一个执行过程就知道了
[解决办法] 递归调用就是压栈和出栈的过程,可以参考c和指针的讲解
[解决办法] 这里的具体过程是怎么样的啊?
int jiesheng(int n)
{
int m;
if(n==1)
m=1;
else
m=jiecheng(n-1)*n;
return m;
}
用一個簡單點的實例演示一下,比如n=3,過程如下:
jiesheng(3); //n==3 m=jiesheng(2)*3; //需要繼續執行jiesheng(2) //n==2 m=jiesheng(1)*2; //需要繼續執行jiesheng(1) // n==1 m=1; //if(n==1), 作爲jiesheng(1)的返回值 m=1*2; // 作爲jiesheng(2)的返回值 m=1*2*3 // 作爲jiesheng(3)的返回值 return m; //得到結果6 ------解决方案--------------------
递归算法可行的原因是,问题能被分解成同质的、较小的问题;并且有一个可到达的终点。
递归类似于把数学归纳反过来
这个问题可以分为两个过程
1,逆推,把求f(k)转换为求f(k-1),一直走啊走,直到f(n)为某个已知的值,本例中就是1.这实际就是函数入栈的过程
2,顺推,反过来已知jiecheng(1)就可以得到jiecheng(2)....直到阶乘k。实际就是函数退栈的过程。