汉诺塔问题和青蛙跳台阶问题的C语言实现。

1.汉诺塔问题

先来介绍一下什么叫汉诺塔问题,

如图,要将A柱子上的圈圈移动到C柱子上面,要求一次只能移动一个圈,且大的圈必须在下面,小的圈必须在上面。

  1. 先把A中的前7个圈移动到B中,在将最大的圈移到C中,则实现了最大圈的移动。

2.要实现7个圈移到B中,则需先把前6个圈,移到C中,则实现第7个圈移到B中。

3.要实现第6个圈移到C中,则需先把前5个圈移到B中,则实现第6个圈的移动。

依次类推,每次移动都依靠空余的柱子完成。

代码实现:

void Hanoi(int n, char A, char B, char C)
{
	if (n == 1)
	{
		printf("%c--->%c\n", A, C);//个数为1,则将A--->C
	}
	else
	{
		Hanoi(n - 1, A, C, B);//将n-1个圈先从A移到B,
		printf("%c--->%c\n", A, C);//将最后一个圈从A--->C
		Hanoi(n - 1, B, A, C);//将B中n-1个圈中,先借助A来移动到C上
	}
}
int main()
{
	int n = 0;
	printf("请输入圈圈个数:");
	scanf("%d", &n);
	Hanoi(n, 'A', 'B', 'C');
	system("pause");
	return 0;
}

输出结果如下,假设n为3:

 打印出交换的步骤。

2.青蛙跳台阶问题

题目:n个台阶,1次可以跳1个台阶,1次也可以跳2个台阶,这只青蛙跳到第你个台阶,有多少种跳法?

当n=1时,只有一种跳法;

n=2时,有2种跳法;

n=3时,有3种跳法;

n=4时,有5种跳法;

n=6时,有8种跳法;有没有发现规律呢?后面一次的跳法等于前两次的跳法种类相加。

即斐波那契数列(兔子数列);

如果用函数递归来实现的话,重复计算的次数太多,当n超过50左右时,会栈溢出。

int fab(int n)//重复次数多,运算量大
{
	if (n <= 2)
		return 1;
	else
		return fab(n - 1) + fab(n - 2);
}
int main()
{
	int n = 0;
	int ret = 0;
	scanf_s("%d", &n);
	//TDD-测试驱动开发
    ret = fab(n);
	printf("%d", ret);
	return 0;
}

可以考虑用循环的方式实现:

int fab(int n)
{
	int a = 1;
	int b = 1;
	int c = 0;
	while (n > 2)
	{
		c = a + b;
		a = b;
		b = c;
		n--;//n为什么要--,为了终止循环,每前进一次,次数少一次,直到算出结果
	}
	return c;
}
int main()
{
	int n = 0;
	int ret = 0;
	scanf_s("%d", &n);
	//TDD-测试驱动开发
    ret = fab(n);
	printf("%d", ret);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值