原创 用LV解决Hanoi问题

2007-2-6 15:22 3158 5 5 分类: 测试测量

        对于Hanoi塔问题,一般最经典的解决方法就是递归,这在C或者Pascal语言中都比较容易实现;LV目前还未支持递归调用(经过尝试……真的不行……连互递归都被识破了,晕);所以对于Hanoi这样的问题,可以用LV提供的Queue(即队列)这样的控件来解决。Queue原先被用来做有关同步或者实时等设计而成,但是它有着更强大的应用前景,作为Stack来解决Hanoi只是抛砖而已,希望大家能挖掘出更多更好的应用;总之,LV其实有时候会让人产生很惊艳的感觉。


        有几点需要说明一下:


        1. Queue的元素我设计为一个Cluster,其中包括Towers(整数数组,其中包含的是盘的信息),1st、2nd、3rd三个字符串(表示起始点,中间站点,目的点);


        2. 由于Queue不能直接当作Stack来用,在实际用的时候需要用 Enqueue Element At Opposite End .vi ,这样就是将新元素直接insert入最前端,这样在Dequeue的时候就能得到的是最近进Stack的元素,从而很方便地实现了Stack的Pop和Push的功能。


        3. 根据经典的算法,过程中的顺序应该为:




  1. void hanoi(int n,char x,char y,char z) {   
  2.     if(n==1) move(x,1,z);    //将编号为1的盘子从 x 移到 z   
  3.     else {   
  4.         hanoi(n-1,x,z,y);    //将 x 上编号 1~n-1 的盘子移到 y ,z 为辅助塔   
  5.         move(x,n,z);         //将 编号 n 的盘子从 x 移到 z    
  6.         hanoi(n-1,y,x,z);    //将 y 上编号 1~n-1 的盘子移到 z ,x 为辅助塔   
  7.     }   
  8. }   

         因为使用了Stack的话,顺序应该有所变动,即先hanoi(n-1,y,x,z),再将编号n的盘子移动,再hanoi(n-1,x,z,y);具体的看程序应该能体会出来,比较难讲清楚。


        整个程序做得还是比较粗糙的,而且编程习惯也不是短时间能养好的,呵呵,见笑了! :)


        版本: LabVIEW 8.2


         rar


 


        


        

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /3 下一条