递归求汉诺塔问题 递归求青蛙跳台问题

本文介绍了如何使用递归方法解决经典的汉诺塔问题和青蛙跳台问题。对于汉诺塔,从A柱子上的n个圆盘移动到C柱子上,通过递归将问题简化为移动(n-1)个圆盘。青蛙跳台问题中,青蛙每次可以跳1级或2级台阶,递归思路是将跳n级台阶的问题分解为跳(n-1)级和(n-2)级台阶的组合。并提供了相应的递归代码实现。
摘要由CSDN通过智能技术生成

1.递归求汉诺塔问题
在汉诺塔问题中,假设有A、B、C三根柱子,A柱子上由上到下从小到大摆放了n个圆盘,要借助B柱子将A柱子上的圆盘由移动到C柱子上,还是按由上到下从小到大摆放。
设想A上有一个圆盘,直接移到C上(a->c),只需要一次 2^1-1;
设想A上有两个圆盘,通过(A->B,A->C,B->C),需要三次 2^2-1;
设想A上有三个盘子,通过(A->C A->B C->B A->C B->A B->C A->C ),
需要七次 2^3-1;
如果有n个盘子,则可把问题归结于把(n-1)个放在B上,再将A上最大的放到C上,现在在B上的(n-1)个盘子,可归结于把(n-2)个放到A上,再将B上最大的放到C上,以此类推,用递归实现。代码如下

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void Move(char pos1, char pos2)
{
	printf("%c->%c ", pos1, pos2);
}
//pos1开始位置
//pos2中间位置
//pos3结束位置
void Hanota(int n, char pos1, char pos2, char pos3)
{
	if (n == 1)
	{
		Move(pos1,pos3);
	}
	else
	{
		Hanota(n - 1, pos1, pos3, pos2);
		Move(pos1, pos3);
		Hanota(n - 1, pos2, pos1, pos3);
	}
}
int main()
{
	int n;
	printf("请输入盘子的数量\n");
	scanf("%d", &n);
	Hanota(n, 'A', 'B', 'C');
	system("pause");
	return 0;
}

2.一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶,问这个青蛙跳上n级台阶一共有多少种跳法。
跳一级台阶一种方法;
跳两级台阶两种方法;1 1 或 2
跳三级台阶三种方法;1 1 1或1 2 或2 1;
跳四级台阶五种方法;1 1 1 1或1 2 1 或1 1 2或2 1 1或 2 2
跳n级台阶,可想为最后一次跳一阶或最后一次跳两阶,则可归结于跳(n-1)级台阶和跳(n-2)级台阶的跳法相加,以此类推,递归实现。代码如下

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int JumpFloor(n)
{
	if (n == 0)
	{
		return 0;
	}
	else if (n <= 2)
	{
		return n;
	}
	else
	{
		return JumpFloor(n - 1) + JumpFloor(n - 2);
	}
}
int main()
{
	int n=0;
	int ret = 0;
	printf("请输入台阶数\n", n);
	scanf("%d", &n);
	ret=JumpFloor(n);
	printf("%d\n", ret);
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值