注册 登录
编程论坛 C++教室

递归函数怎么这么难理解啊

阿冲 发布于 2009-10-13 14:03, 2965 次点击
谁能帮忙讲解一下啊???
6 回复
#2
qq3781663962009-10-13 14:19
简单点理解,递归函数数2个基本要素:一个是描述问题规模逐步缩小的递归算法,一个是描述基本情况的递归终止条件;
下面举个简单的例子 求n!

#include<iostream.h>

long fact(int n){
if(n==0) return 1;                //递归终止条件
else return n*fact(n-1);         //递归调用
}


void main(){
int n;
cout<<"input n:";
cin>>n;
cout<<"n!="<<fact(n)<<endl;
}

调用参数 n-1 使问题缩小
#3
jjg2009-10-14 10:21
记住函数体内有自己调用自己的函数
#4
最左边那个2009-10-14 10:29
相信你听过一个故事:
从前有座山,山里有座庙,庙里有两个和尚,老和尚对小和尚讲了个故事:从前有座山,山里有座庙,庙里有两个和尚,老和尚对小和尚讲了个故事:.......

就这么循环下去,这就是递归!
#5
newCpp2009-10-14 18:47
这玩意好像是有点晕,不过我发现一问题!
他好像在执行cout<<"n!="<<fact(n)<<endl;
这个地方的时候他会重新调用一下fact函数然后重新判断
不过有一点我也没搞明白,不是说动态的变量调用完成后就会消失的吗?
为什么他重新调用的时候也没有消失,难道他是
直接跳转到If语句的?
#6
最左边那个2009-10-14 20:05
他好像在执行cout<<"n!="<<fact(n)<<endl;
这个地方的时候他会重新调用一下fact函数然后重新判断

对,就是这样的,详细的说,应该是从第一次执行fact(n)以后,进到函数体里,会不断的调用fact函数,直到遇到终止信息!

另外个人觉得这里没有动态开辟什么啊?你认为哪个是动态开辟的变量呢?

现在退一步老说,就算有吧,我认为是这样的,当遇到fact(n)的时候,实参n传递给形参,然后就执行里面的函数,就算每次都重新调用,但是你可以理解为这全部调用都属于一个整体的大函数,是不可分割的,这样的话,所谓的变量调用完成,就是cout<<"n!="<<fact(n)<<endl这里的fact(n)函数完成,也就是main函数基本结束了,这时候也确实释放动态开辟的东西!
#7
东海一鱼2009-10-14 22:26
每次递归调用所传入的参数是会占用‘栈’空间的,如果递归层数太深,‘栈’空间被消耗尽。递归同样失败。

‘栈’空间的压入、弹出就是个动态的过程。
1