Hanoi塔问题(递归解决)

首先了解一下递归的思想:

        设计一个递归函数,一般需要首先分析以下问题。

* 退出递归的边界条件及其边界值。即分析在什么情况下,才可以直接求出问题的解,从而退出递归。

* 执行递归的通式。把一个大规模问题分解为小规模问题之后。需要哪些方法保证两者的性质相同。

    然后在设计递归函数时,使用选择语句判断边界条件是否成立,如成立,则直接返回函数;否则使用通式递归调用。

#include <stdio.h>

void move(int n,char a,char b,char c)    //此函数实现将a上的n个圆环转移到c上
{
if(n==1)
printf("%c-->%c\n",a,c);    //当时1时,直接将此圆盘移动到C盘
else{
move(n-1,a,c,b);
printf("%c-->%c\n",a,c);;
move(n-1,b,a,c);
}
}

int  main()
{
int n;
scanf("%d",&n);
move(n,'a','b','c');//将a上的n个圆环转移到c上 
}

 

 

Hanoi塔算法分析:

 

 

设A上有n个盘子,如果n=1则直接将这一个圆盘从A移动到C即可(这也是辨认此递归的临界条件);如n!=0,则分为三步,把n-1个盘子从A移动到B,把A上最后一个圆盘移动到C,此时只需要把B上的n-1个圆盘移动到C(这便形成递归)。在递归调用过程中n=n-1,故n的值逐渐递减,最后n=1,达到临界条件,终止递归,逐级返回,便实现最终结果。

~~对move函数的特别说明:move(...)是干什么的,所有的move(***)便是干什么的,先不用想它具体实现过程,只需找到临界时的处理方式即可。此题move便是实现

将a上的n个圆环转移到c上 ,‘a'‘c’‘n’都是相对的。

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值