读书人

递归的具体调用是如何样的啊

发布时间: 2013-01-23 10:44:49 作者: rapoo

递归的具体调用是怎么样的啊?


#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。实际就是函数退栈的过程。

读书人网 >C语言

热点推荐