什么是递归函数?
递归函数其实就是调用自身的函数,但是必须满足以下两个条件:
- 1)在每一次调用自身时,必须是更接近于最终结果; (递推式)
- 2)必须有一个确定的递归终止条件,不会造成死循环。(终止条件)
看一个简单且经典的例子:
青蛙跳台阶问题:一只青蛙要跳上n层高的台阶,一次能跳一阶,也可以跳2阶,请问这只青蛙跳上n层高的台阶有多少种跳法?
问题解决:这个问题有好几种解法,这里就讲递归方法,这个问题需要逆向思维,如果从第一个台阶就开始算,就比较难想到终止条件,以及递归调用方式。我们可以让青蛙下台阶,一次可以下一个,也可以下两个。这时我们可以知道:
- 当n=1时,只有一种方法。
- 当n=2时,有两种方法。
- 其n>2时,青蛙可以选择跳两层台阶,也可以选择跳一层台阶。
以上我们可以得到,终止条件为台阶剩下1或2层时可以直接得到结果,即为边界。当n>2时我们可以使用递归语句调用自身。这样就可以写出递归代码:
int climbStairs(int n){
//终止条件
if(n == 1)
return 1;
if(n == 2)
return 2;
//递归调用,此时青蛙可以选择跳一阶也可以跳两阶,所以将两种情况相加起来
return climbStairs(n-1) + climbStairs(n-2);
}
再看一个简单的例子,设计一个递归函数求出数组的最大值及其所有元素。
#include<stdio.h>
int maxNumber(int number[],int n);
void outPut(int number[],int n);
int main(){
int a[10],i;
for(i=0;i<10;i++){
scanf("%d",&a[i]);
}
int max=maxNumber(a,9);
outPut(a,10);
printf("\n");
printf("%d\n",max);
return 0;
}
int maxNumber(int number[],int n){
if(n<=1){
return number[0];
}else{
if(maxNumber(number,n-1)>number[n]){
return maxNumber(number,n-1);
}else{
return number[n];
}
}
}
void outPut(int number[],int n){
if (n <= 0)
return;
outPut(number,n-1);
printf("%d ",number[n-1]);
}