栈与递归的实现:n阶Hanoi塔的算法分析与源码

很郁闷的一件事情,本来已经写好了,不只怎么网页跳走了,白写了

这就随便说下.

栈是有"先进后出"的原则,而嵌套函数也一样有一个原则是:'"后调用先返回" 
这就和栈的进出相符合了.

这里拿Hanoi塔的问题来分析(不画图了,要看图的翻 数据结构的那本书看下)

 

 

// 下面是算法.
/*
*************n阶Hanoi塔的问题******************** */
#include
< stdio.h >
void  hanoi( int  n, char  x,  char  y,  char  z)
{   
// 将塔座x上按直径有小到大且自上而下编号为1至n的n个圆盘按规则搬动到
    
// 塔座z上,y塔座可以用做辅助move() // 搬动函数
     if (n == 1 )
    {
        move(x,
1 ,z); // 当n==1时,则搬动x上的圆盘放到z上
    }
    
else
    {
        hanoi(n
- 1 ,x,z,y); // 将x上编号为1至n-1的圆盘移动到y,z做辅助塔
        move(x,n,z); // 执行搬动操作        
        hanoi(n - 1 ,y,x,z); // 将y塔座上的编号为1至n-1的圆盘移动到z上,x做辅助塔
    }
}
main()
{
    
int  n, a, b, c;
    ...........
    ...........
    hanoi(n,a,b,c);
}

 

// 下面是分析.
/*
*************n阶Hanoi塔的问题******************** */
#include
< stdio.h >
void  hanoi( int  n, char  a,  char  b,  char  c)
{   
if (n == 1 )
    {
        move(x,
1 ,z); // 当n==1时,则搬动x上的圆盘放到z上
    }
    
else
    {
        hanoi(
2 ,a,b,c); // 2层push(6,2,a,b,c)=====>>>>
        {
            
void  hanoi( int   2 , char  a, char  b, char  c)
            {
                
if (n == 1 ) move(a, 1 ,c); //
                 else
                {
                    
/* ************3层push(8,1,a,c,b)************* */
                    hanoi(
1 ,a,c,b);
====================>>>>>>>                         
                   
void  hanoi( int   1 , char  a, char  c,  char  b)
                    {
                        
if (n == 1 )move(a, 1 ,b) // 符合n==1,执行完if下面就不执行了
                    } // 执行完,返回2层
                    /* ***********出栈pop(8,1,a,c,b)********************* */                                      
                    move(a,
2 ,c); // 搬动第2个圆盘
                    
                    
/* **************进入3层push(8,1,b,a,c)***************** */
                    hanoi(
1 ,b,a,c)
======================>>>>
                      
void  hanoi( int   1 , char  b, char  a, char  c)
                    {
                        
if (n == 1 )move(b, 1 ,c); // 下面不执行了
                    }
                    
/* **********返回2层,出栈pop(8,1,b,a,c)***************** */
                }
            }
        }
// 返回到1层,出栈pop(6,2,a,b,c)

        move(x,
3 ,z); // 执行搬动操作
        
        
        hanoi(
2 ,b,a,c); // 与上面进入2层操作是一样的。这里就不写了
    }
}
main()
{
    
int  n, a, b, c;
    ...........
    ...........
    hanoi(n,a,b,c);
// 1层push(0,3,a,b,c);
}

 程序不难的。主要是思想。
在这我把程序给补出来。由于现在手头没编译器,布局不好请大家鉴谅~

#include<stdio.h>
void hanoi(int n,char x,char y,char z);
void move(char one, char three);

void move(char one, char three)
{
   printf("%c--->%c/n",one,three);
}
void hanoi(int n,char x, char y,char z)
{
  if(n == 1)move(x,z);
  else
  {
     hanoi(n-1,x,z,y);
     move(x,z);
     hanoi(n-1,y,x,z);
   }
}
        

main()
{
  int  n;
  printf("input n:");  /* n个盘*/
  scanf("%d",&n);
  hanoi(n,a,b,c);  /*把a上的n个盘经b移动到c*/
   
  return 0;
}

真正了解了之后就对栈有了个比较清楚的了解,明白栈与函数之间的关系

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值