C语言学习 Day10(用递归和循环分别解决青蛙跳台阶问题)

今天主要研究如何解决青蛙跳台阶问题,分为以下两种方法

一、递归

二、循环 

那么什么是青蛙跳台阶问题呢?接下来就介绍一下:

一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。

下面就是通过C语言的方法来解决这个问题。 

一、递归

首先对问题进行分析。当n>2时,我们可以设跳法总数为f(n),那么我们的目标就是找出f(n)的递推公式。那么应该怎么找呢?思路是这样的:

f(n)是跳n阶的总方法个数,那么在跳到第n个台阶之前只有两种可能,一种是在第n-1个台阶,另一种则是在第n-2个台阶,那么跳n阶的总方法个数不就是跳到第n-1个台阶的方法数和跳到第n-2个台阶的方法数之和吗?也就是f(n)=f(n-1)+f(n-2)这样我们就找到了递推公式。

当n=1时,则有1种,n=2,则有两种,由此我们可以写出代码:

#include<stdio.h>

int fang_fa_zong_shu(int n)
{
	if (n == 1)
	{
		return 1;
	}
	else if (n == 2)
	{
		return 2;
	}
	else
	{
		return fang_fa_zong_shu(n - 1) + fang_fa_zong_shu(n - 2);
	}
}

int main()
{
	int n = 0;
	int ret = 0;
	scanf("%d", &n);
	ret = fang_fa_zong_shu(n);
	printf("%d\n", ret);
	return 0;
}

以上就是通过递归的方法解决青蛙跳台阶问题的思路和代码演示,方法不唯一 ,仅供参考。

二、循环

同样对问题进行分析,我们可以设跳2次的个数为x,跳1次的个数为y,则会有以下思路:

n可以由x和y表示,即n = 2x + y。由这个思路我们即可通过循环找出所有x和y的可能取值,然后再通过组合问题,用C_{x+y}^{x}{\color{Red} }求出x,y在每种取值的所有顺序,再累加起来,就是方法的总数。

以下是代码演示:

#include<stdio.h>

int jie_cheng(int n)
{
	int i = 0;
	int sum = 1;
	for (i = 1; i <= n; i++)
	{
		sum *= i;
	}
	return sum;
}

int zu_he(int x, int y)
{
	int sum = 0;
	sum = jie_cheng(x + y) / (jie_cheng(x) * jie_cheng(y));
}

int fang_fa_zong_shu(int n)
{
	int x = 0;//跳2次的个数
	int y = 0;//跳1次的个数
	int sum = 0;
	//n,x,y满足 n = 2x + y
	for (x = 0; x <= (n / 2); x++)
	{
		y = n - 2*x;
		int ret = 0;
		ret = zu_he(x, y);//计算x,y组合个数
		sum += ret;
	}
	return sum;
}

int main()
{
	int n = 0;
	int ret = 0;
	scanf("%d", &n);
	ret = fang_fa_zong_shu(n);
	printf("%d\n", ret);
	return 0;
}

 总结

两种方法对比可知,递归代码量更少,更加方便阅读,但是运算量相较于循环也更大。而循环代码量更多,代码不方便阅读,但是运算量较小。

以上就是今天的学习内容了,感谢您的阅读,欢迎指出错误! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

听说有人ID没取完就

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

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

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

打赏作者

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

抵扣说明:

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

余额充值