C语言递归——青蛙跳台阶问题和汉诺塔问题

一、青蛙跳台阶问题

题目描述:

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

问题分析:

青蛙跳台阶问题可以分成n个子问题。假设青蛙要跳上n级台阶,那么它的最后一步有两种选择:
1.从第n-1级台阶跳1步到达第n级
2.从第n-2级台阶跳2步到达第n级

所以,跳到第n级台阶的跳法数等于跳到第n-1级台阶的跳法数 加上跳到第n-2级台阶的跳法数 ,用数学函数表示为**F(n) = F(n-1) + F(n-2)**

边界条件:
1.当n=1时,青蛙只能跳1步,因此只有一种跳法: F(n) = 1
2.当n=2时,青蛙有两种跳法:连续跳两步,或者直接跳两步,有两种跳法: F(n) = 2

1.递归解法:

优点:简单直观,易理解

缺点:效率极低,不适合较大的n,时间复杂度为2^n

c 复制代码
#include <stdio.h>
int F(int n)
{
	if (n <= 0)
	{
		return 0;
	}
	if (n == 1)
	{
		return 1;
	}
	if (n == 2)
	{
		return 2;
	}
	return F(n - 1) + F(n - 2);
}

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

2.迭代(循环)方法

优点:避免重复计算,效率高

c 复制代码
#include <stdio.h>
int F(int n)
{
	if (n <= 0)
	{
		return 0;
	}
	if (n == 1)
	{
		return 1;
	}
	if (n == 2)
	{
		return 2;
	}

	int a = 1;
	int b = 2;
	int c = 0;
	for (int j = 3; j <= n; j++)
	{
		c = a + b;
		a = b;
		b = c;
	}
	return c;
}

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

二、汉诺塔问题

题目描述:

有三根柱子,分别为A、B和C。在A柱子上有n个大小不一的盘子,从上到下依次增大。目标是将所有盘子从A柱子移动到C柱子上,移动过程中需要满足以下规则:

•每次只能移动一个盘子

•每次移动时,盘子必须从顶部移动到另一根柱子的顶部

•任何时候,较大的盘子不能放在较小的盘子上面

解题思路:

假设我们需要将n 个盘子从A柱子移动到C柱子,可以分解为以下步骤:

•将上面的n-1个盘子从A柱子移动到B柱子(借助C柱子)

•将第n个盘子(最大的盘子)从A柱子直接移动到C柱子

•再将B柱子上的n-1个盘子移动到C柱子(借助A柱子)

递归公式:

• 如果只有一个盘子(n=1),直接将盘子从A柱子移动到C柱子

• 如果有n个盘子(n>1),按照上述三步递归解决
终止条件:

• 当n=1时,直接移动盘子,无需进一步分解

1.解法

优点:简洁易懂

缺点:计算较大的数,时间会很久

c 复制代码
#include <stdio.h>
void hanoi(int n, char A, char B, char C)
{
	if (n == 1)
	{
		printf("将第%d个盘子从%c柱子移动到%c柱子\n", n, A, C);
		return;
	}
	//将n-1个盘子从A移动到B,借助C
	hanoi(n - 1, A, C, B);

	//将n-1个盘子从A移动到C
	printf("将第%d个盘子从%c柱子移动到%c柱子\n", n, A, C);

	//将n-1个盘子从B移动到C,借助A
	hanoi(n - 1, B, A, C);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	hanoi(n, 'A', 'B', 'C');
	return 0;
}
相关推荐
碧海银沙音频科技研究院8 小时前
虚拟机ubuntu与windows共享文件夹(Samba共享)解决WSL加载SI工程满卡问题
人工智能·深度学习·算法
CoovallyAIHub8 小时前
ICLR 2026 | VLM自己学会调检测器:VTool-R1用强化学习教视觉模型使用工具推理
算法·架构·github
CoovallyAIHub8 小时前
RK3588上111 FPS:轻量YOLOv8+异步视频处理系统实现无人机自主电力巡检
算法·架构·github
14年ABAP码农9 小时前
ABAP - call API with x-www-form-urlencoded
开发语言
SuniaWang9 小时前
Java 17实战:Record与密封类的黄金搭档
java·开发语言·python
12.=0.9 小时前
【stm32_5】Systick嘀嗒定时器、解析时钟源、分析时钟树、应用Systick设计延时
c语言·stm32·单片机·嵌入式硬件
2401_827499999 小时前
python项目实战10-网络机器人03
开发语言·python·php
炽烈小老头9 小时前
【每天学习一点算法 2026/04/13】两数相除
学习·算法
AIminminHu9 小时前
OpenGL渲染与几何内核那点事-项目实践理论补充(三-1-(3):番外篇-当你的CAD打开“怪兽级”STL时:从内存爆炸到零拷贝的极致优化)
开发语言·c++·线程·多线程
嘻嘻哈哈樱桃9 小时前
俄罗斯套娃信封问题力扣--354
算法·leetcode·职场和发展