汉诺塔问题 和 青蛙跳台

本文介绍了使用递归算法解决汉诺塔问题和青蛙跳台问题的思路与实现。对于汉诺塔问题,通过递归地移动盘子,最终将所有盘子从A柱移动到C柱。而对于青蛙跳台问题,利用斐波那契数列的性质计算出跳上n级台阶的不同方式。文章提供了相应的递归函数实现,并展示了如何通过打印移动步骤来展示汉诺塔问题的解法过程。
摘要由CSDN通过智能技术生成

汉诺塔问题
一块板上有三根针 A、B、C。A 针上套有 64 个大小不等的圆盘,按照大的在下、小的在上的顺序排列,要把这 64 个圆盘从 A 针移动到 C 针上,每次只能移动一个圆盘,移动过程可以借助 B 针。但在任何时候,任何针上的圆盘都必须保持大盘在下,小盘在上。从键盘输入需移动的圆盘个数,给出移动的过程。
思路:在简单的尝试之后我们会发现一个规律,要想把n个盘子都移到C柱子上,首先要把最大的盘子移到C柱子上,要把最大的盘子移到C上就必须把最大的上面的n-1个盘子移到B柱子上,待最大的盘子移到C柱子上,然后再将n-1个盘子移到C柱子上。如下三步:
(n-1)个盘子A–>B + 最大的盘子A–>c + (n-1)个盘子B–>C
看第一步,而如何将n-1个盘子从A移到B?思路也是一样的 ,由于第n个盘子比前n-1个盘子都要大,所以在这一层递归相当与没有
(n-2)个盘子A–>C + 最大的盘子A–>B + (n-2)个盘子C–>B
同理第三步:
(n-2)个盘子B–>A + 最大的盘子B–>C + (n-2)个盘子A–>C
以上的最大的盘子指的是要移动的x个盘子的最大的那个
所以整个过程就变成

  • ((n-2)个盘子A->C+最大的盘子A–>B +(n-2)个盘子C–>B)+最大的盘子A–>c + ((n-2)个盘子B–>A
    +最大的盘子B–>C + (n-2)个盘子A–>C)

如果令递归函数为fun(int n): 递归的式子就是:fun(n-1)+1+fun(n-1)
递归到只剩两个的时候只要移动三次就可以

int fun(int n)
{
	if (n > 2)
		return fun(n - 1) + 1 + fun(n - 1);
	else
		return 3;
}

进阶要求,要求打印出每一次移动的步骤:
思路:需要两个函数,一个用来打印步骤,一个用来完成递归

void move(char x,char y)
{
	printf("%c到%c ", x, y);
}
void fun1(int n, char a, char b, char c)
{
	if (n == 1)
	{
		move(a, c);
	}
	else
	{
		fun1(n - 1, a, c,b);
		move(a, c);
		fun1(n - 1, b, a,c);
	}
}

青蛙跳台问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路:
当青蛙遇到下次跳跃时会有两个选择:跳一个台阶,跳两个台阶,如果函数为fun()则返回为fun(n-1)+fun(n-2),当青蛙面前只有一个台阶的时候青蛙没有选择了,只能跳一个台阶,顾返回1

int fun(int n)
{
	if (n > 1)
		return fun(n - 1) + fun(n - 2);
	else
		return 1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值