递归函数的本质及其经典应用

文章介绍了递归函数的概念,强调了递归需满足的两个条件:递推式和终止条件。通过青蛙跳台阶问题展示了如何使用递归解决问题,然后提供了一个递归函数来找出数组中的最大值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是递归函数?

递归函数其实就是调用自身的函数,但是必须满足以下两个条件:

  • 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]);
} 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

༄༊心灵骇客༣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值