简单易懂!青蛙跳台阶和汉诺塔问题详解!不要错过哇!

1. 青蛙跳台阶

1.1 题目

一只青蛙可以一次跳一级台阶,也可以一次跳两级台阶,如果青蛙要跳上n级台阶,共有多少种跳法?

1.2 逻辑分析

下面,我们先举一些例子看看:

n=1,只有1种跳法

简单易懂!青蛙跳台阶和汉诺塔问题详解!不要错过哇!_第1张图片


                                                                          n=1

n=2,有2种跳法

一次1级or一次2级

简单易懂!青蛙跳台阶和汉诺塔问题详解!不要错过哇!_第2张图片

                                                                           n=2

n=3,有3种跳法

一次1级or先2级后1级or先1级后2级

简单易懂!青蛙跳台阶和汉诺塔问题详解!不要错过哇!_第3张图片

                                                                          n=3

从上面3个例子可以看出,n个台阶,就有n种跳法。

那么,规律是否就是如此呢?

n=4,有4种跳法

一次1级or先1级后2级后1级or先2级后1级后1级or先2级后2级

简单易懂!青蛙跳台阶和汉诺塔问题详解!不要错过哇!_第4张图片

                                                                            n=4

由此,可知,并不是有n级台阶就有n种跳法 

1.2.1 规律实现

eg.4个台阶时
1.先跳一级,以第一级为起点,还有3级台阶,由图可知,3级台阶共3种跳法
2.先跳两级,以第二级为起点,还有2级台阶,由图可知,2级台阶共2种跳法
3.汇总:

4级台阶跳法是2级台阶和3级台阶的跳法的总和

4级台阶共5种

n>3时,满足有n级台阶的跳法=(n-1)级台阶跳法+(n-2)级台阶跳法

类似斐波那契数列问题

而n=1,2,3时,满足有n级台阶就有n种跳法的规律

由此,可推出:

简单易懂!青蛙跳台阶和汉诺塔问题详解!不要错过哇!_第5张图片

1.3 代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include
//青蛙跳台阶问题
int Jump(int n)
{
	if (n <=3)
	{
		return n;
	}
	else 
	{
		return Jump(n - 1) + Jump(n - 2);
	}
}
int main()
{
	int n = 1;//台阶数
	scanf("%d ", &n);
	int ret = Jump(n);
	printf("%d种跳法", ret);
	return 0;
}

                                                                        输出界面

2. 汉诺塔问题

2.1 题目

将A柱上的n个盘子,借助B柱,最终全部挪到C柱上。挪到的过程中ABC柱上的盘子,必须保持大盘子在小盘子底下。

2.2 逻辑分析

下面,我们先举一些例子看看:

n=1,只用挪动1次:A---->C

简单易懂!青蛙跳台阶和汉诺塔问题详解!不要错过哇!_第6张图片

                                                                      n=1

n=2,挪动3次:A---->B   A---->C   B---->C

简单易懂!青蛙跳台阶和汉诺塔问题详解!不要错过哇!_第7张图片

                                                                      n=2

n=3,挪动7次:A---->C   A----->B   C---->B   A---->C   B---->A   B---->C   A---->C

简单易懂!青蛙跳台阶和汉诺塔问题详解!不要错过哇!_第8张图片

                                                                      n=3

2.2.1 规律实现

移动次数规律:

n=1,共移动1次

n>1,共移动(2^n  -1)次

eg.n=2,移动3次,3=2^2-1 

n=3,移动7次,7=2^3-1

移动位置规律:

每次先移动(n-1)个盘子,将(n-1)个盘子通过B柱实现中转,接着将剩余的最后1个盘子移动到C柱上,最后将(n-1)个盘子通过A柱实现中转,移动到C柱上

2.3 代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
//汉诺塔问题
//n:盘子个数
//pos1:起始位置
//pos2:中转位置
//pos3:目标位置
int count = 0;
void move(char pos1, char pos2)//模拟盘子移动过程
{
	printf("%c --> %c \n", pos1, pos2);
	count++;//计数
}
//有n个盘子,先将(n-1)个盘子从A通过C挪到B
//只剩1个盘子,直接从A挪到C
void Hanoi(int n, char pos1, char pos2, char pos3)
{
	if (n == 1)
	{
		move(pos1, pos3);//只剩1个盘子,直接从A挪到C
	}
	else
	{
		Hanoi(n - 1, pos1, pos3, pos2);//有n个盘子,先将(n-1)个盘子从A通过C挪到B	       
        move(pos1, pos3);//只剩1个盘子,直接从A挪到C		
        Hanoi(n - 1, pos2, pos1, pos3);//将剩余的(n-1)个盘子从B通过A挪到C
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	Hanoi(n, 'A', 'B', 'C');
	printf("%d个盘子需要移动%d次\n", n, count);
	return 0;
}

简单易懂!青蛙跳台阶和汉诺塔问题详解!不要错过哇!_第9张图片

                                                                      输出界面 

PS:小江目前是个新手小白,目前,自己就总结了这些自己觉得有意义的题目。欢迎大家在评论区讨论哦!有问题也可以讨论的!

如果对你有帮助的话,记得点赞+收藏⭐️

你可能感兴趣的:(c语言)