c语言-递归-汉诺塔

概念补充:

递归:程序调用自身的编程技巧。

递归目的:把一个大型的复杂的问题转化为一个与原问题相似的但是规模较小的问题,层层求解。简称“大事化小”。

必要条件: 存在限制条件;

                   ②每次递归后要接近限制条件;


汉诺塔

如图有三个柱子A、B、C,在柱子A上有n个圆盘,要求借助柱子B将圆盘全部移动到C柱上。

要求:一次只能移动一个圆盘;尺寸小的圆盘必须位于尺寸大的圆盘之上。


解题思路:(假设在起始位置A柱子上有n个圆盘)

n = 1:A -> C

n = 2 :A ->B        A ->C        B ->C

n = 3:    A-->C        A-->B        C-->B        A-->C        B-->A         B-->C        A-->C

   ···

n = N:主要分为 3步

step1:A  --> B ( N-1 ) (  将 上 N-1 个圆盘移动到 上  )

step2:A  --> C ( 1 ) (  将 上的1个圆盘移动到  上  )

step3:B  --> C ( N-1 ) (  将 上 N-1 个圆盘移动到 上  )

设计迭代函数:

void Hanno(int n, char a, char b, char c)
{
	if (n == 1)
	{
		move(a, c);
	}
	else
	{
		Hanno(n - 1, a, c, b);    //step1  反复迭代,将A上N-1个圆盘放在B上
		move(a,c);                //step2  将A上仅剩的1个圆盘放在C上
		Hanno(n - 1, b, a, c);    //step3  反复迭代,将B上N-1个圆盘全部放在C上
	}
}

完整代码参考:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

void move(char p1, char p2)
{
	printf("%c-->%c  ",p1,p2);
}

void Hanno(int n, char a, char b, char c)
{
	if (n == 1)
	{
		move(a, c);
	}
	else
	{
		Hanno(n - 1, a, c, b);
		move(a,c);
		Hanno(n - 1, b, a, c);
	}
}

int main()
{
	int n;
	char A, B, C;
	A = 'A';
	B = 'B';
	C = 'C';
	printf("汉诺塔的阶数选择:\n");
	scanf("%d\n",&n);
	Hanno(n,A,B,C);
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值