函数递归:汉诺塔,青蛙跳台阶


两个问题均要先画图找规律。分析后再写代码

1. 汉诺塔问题

题目:

有三个柱子:A, B, C
起始:有n个盘子(由小到大,从上往下放置)都在A柱子上
目的:把A柱子上的所有盘子移到C柱子上,并求出最少的移动步骤
限制条件:一次只能移动一个盘子,大的盘子只能放在小的盘子下面

分析:

如果只有一个盘子,直接把盘子从A移到B

如果不止一个盘子,则通过B和C把n-1个盘子移到B,把最大的盘子移到C
以此类推
通过手动推导可以发现符合数学规律,步骤为2^n - 1
当n为10时,程序就要跑很久了

代码:

#include<stdio.h>

void move(char pose1, char pose2)
{
	printf("%c->%c ", pose1, pose2);
}

void Hanoi(int n, char pose1, char pose2, char pose3)//依次起始,中转,目标
{
	if (n == 1)
	{
		move(pose1, pose3);
	}
	else
	{
		Hanoi(n - 1, pose1, pose3, pose2);//依次起始,中转,目标
		move(pose1, pose3);
		Hanoi(n - 1, pose2, pose1, pose3);//依次起始,中转,目标
	}
}

int main()
{
	int n;
	scanf("%d", &n);
	Hanoi(n, 'A', 'B', 'C');
	printf("\n");
	return 0;
}

2.青蛙跳台阶问题(斐波那契数列)

题目:

有一只青蛙,它有两种跳的方式:一次一台阶,一次两台阶
有n级台阶
问:青蛙一共有多少种跳法

分析:

先画图分析,找规律
n = 1, 1
n = 2, 2
n = 3, 3 (1 + 2)
n = 4, 5 (2 + 3)
n = 5, 8 (3 + 5)
当n大于2时,青蛙起跳,有两种情况:
1.跳一阶
跳上去后把这个看成起点,问题就变成青蛙要跳n - 1 阶(往前推算已经求过)
2.跳两阶
跳上去后把这个看成起点,问题就变成青蛙要跳n - 2 阶(往前推算已经求过)
结果:
把这两种情况数加起来

代码:

#include<stdio.h>

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

int main()
{
	int n;
	scanf("%d", &n);
	printf("青蛙跳%d个台阶有%d种跳法\n", n, jump(n));
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值