1.递归的定义
(1)若一个对象部分地包含它自己,或用它自己给自己定义,则称这个对象是递归的;
(2)若一个过程直接地或间接地调用自己,则称这个过程是递归的过程。
在以下三种情况下,常常用到递归方法:
定义是递归的,数据结构是递归的,问题的解法是递归的。
2.递归的方法解决问题再函数中用的很常见,这里我们举最常见的斐波那契数列(Fibonacci sequence)
对于:1 1 2 3 5 8 13 21
我们不难得到如下关系(第n项):
f(n)=f(n-1)+f(n-2);//称此为关系
f(1)=1,f(2)=2;//而这里代表的是出口
因此这里定义关系和出口后,能确实唯一的一个数列,一般的我们将数列的第一项定义为出口(任意一项都可定义),但对于该斐波那契数列,光定义f(1)=1还不够,还需要f(2)=1;通俗的讲就是要让程序知道你是从哪开始的。
【1】用递归思想实现求斐波那契数列第n项的值
include <stdio.h>
int f(int n){
if(n==1){
return 1;
}
else if(n==2){
return 1;
}
else{
return (f(n-1)+f(n-2));
}
}
int main(){
int num=f(6);
printf("num=%d\n",num);
}
以求n!为例,联系栈的知识可如图表示递归执行的过程(递归的调用就是把当前状态压入堆栈)
2.递归工作栈
递归过程在实现时,需要自己调用自己每一次递归调用时,需要为过程中使用的参数、局部变量等另外分配存储空间,层层向下递归,退出时的次序正好相反:
递归的要素:递归语句,递归次数,递归出口