递归的两个实例————汉诺塔问题以及青蛙跳台阶问题

汉诺塔问题

什么是汉诺塔问题

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
递归的两个实例————汉诺塔问题以及青蛙跳台阶问题_第1张图片
用图片来说就是把A中的圆盘借助B放入C中,使C与初始的A保持一致。

代码原理

首先看只有一个圆盘时:
递归的两个实例————汉诺塔问题以及青蛙跳台阶问题_第2张图片
我们只需将A中的圆盘移动到C中就行。

当有两个圆盘时:
递归的两个实例————汉诺塔问题以及青蛙跳台阶问题_第3张图片
我们需要做的就变成了:A–>B,A–>C,B–>C

当有三个圆盘时:
递归的两个实例————汉诺塔问题以及青蛙跳台阶问题_第4张图片
通过字母简单说明就是:A–>C,A–>B,C–>B,A–>C,B–>A,B–>C,A–>C

我们假设A柱子为pos1,B柱子为pos2,C柱子为pos3。如果只有一个盘子的话我们只需将A–>C,若超过一个盘子我们都需要将n-1个盘子通过C柱子移动到B柱子中,再将A中的最后一个盘子移动到C中,最后通过A柱子将B柱子中的盘子移动到C中。代码大致就为:

#include

void move(char pos1, char pos2)
{
	printf(" %c->%c ", pos1, pos2);
}

void Hanoi(int n, char pos1, char pos2, char pos3)
{
	if (n == 1)
		move(pos1, pos3);
	else
	{
		Hanoi(n - 1, pos1, pos3, pos2);
		move(pos1, pos3);
		Hanoi(n - 1, pos2, pos1, pos3);
	}
}

int main()
{
	int n = 0;
	char pos1 = 'A';
	char pos2 = 'B';
	char pos3 = 'C';
	scanf("%d", &n);
	Hanoi(n,pos1,pos2,pos3);//pos1表示起始位置,pos2表示转移位置,pos3表示结束位置
	return 0;
}

递归的两个实例————汉诺塔问题以及青蛙跳台阶问题_第5张图片

青蛙跳台阶问题

什么是青蛙跳台阶问题

一只青蛙可以一次跳 1 级台阶或一次跳 2 级台阶, 问要跳上第 n 级台阶有多少种跳法?

代码的实现

当只有一个台阶时,很明显青蛙只有一种跳台阶的方法;当有两个台阶时,青蛙可以一个一个台阶跳,也可以一次性跳两个台阶,因此有两种方法;当有三个台阶时我们可以先跳一个,接着就是和上面两个台阶相同的跳法,如果先跳两个,则和只有一个台阶时的跳法相同。由此我们可以得到最重要的一条代码:Jump(n)=Jump(n-1)+Jump(n-2),然后便可得到我们的代码:

#include

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

int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Jump(n);
	printf("%d个台阶有%d个方法\n", n, ret);
	return 0;
}

递归的两个实例————汉诺塔问题以及青蛙跳台阶问题_第6张图片

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