标签:
关于递归函数的认识是在学习了数据结构的栈这一概念后有新的理解。
首先说一下递归函数的概念,我的理解就是一个自己调用自己本身的函数。既然是调用函数,那先看一下普通的函数调用问题。
一、普通函数调用问题
用主函数main()调用函数sum()函数来作比:
void main(){
//其他语句1
sum();
//其他语句2
}
整个程序运行的入口是main(),当main()函数运行完“其他语句1”遇到sum();语句时,main做的工作就是:
1.保存现场(保存现场这一操作就用到了前面提到的栈)
2.传递参数
当sum()函数运行结束返回main时,被压栈的“现场”出栈,继续运行“其他语句2”。接下来说递归函数调用问题。
二、递归函数调用问题
递归函数调用和普通的函数调用的区别就在调用了自己本身,使得理解上有一点困难,用一个例子:
void fun(int n){
if (n=1)
//语句1;
else
fun(n-1);
//其他语句2;
}
函数执行的过程是,前n-1步都执行的else语句,直到参数值为n-1=1时,“递”的过程才结束,此时才是“其他语句2”的第一次执行,然后才返回参数值为n-1=2这一层函数,
之后是第二次“其他语句2”的执行,以此类推到参数为n这一层函数,这是“归”的过程。
在“递”的过程中与栈相关的操作是入栈,就是将每一层函数的“现场”压栈;“归”的过程中与栈相关的操作是出栈,就是返回上一层函数时将“现场”出栈。
总结来说,递归函数就是利用“栈”这种数据结构,从“原点”“递”到最深层,再“归”到“原点”。
标签:
原文地址:http://www.cnblogs.com/jiangcsu/p/5376429.html