zoukankan      html  css  js  c++  java
  • 通过汉诺塔对递归的理解

    递归函数:含有(赋值语句,if-else,whille)结构的都可以改成递归。
    问题本身是递归定义的,可以用递归表示算法。

    递归是自顶向下运行但是计算是在回溯时计算。因此一般找到递归因子即可,忽略中间过程。

    而迭代都是自低向上求解。
    递归的2个条件:
    1.构造递归终止的边界条件
    2.实现递归调用

     

    如:汉诺塔问题:有3个塔,A,B,C,第一个塔有n个盘子,盘子从上到下直径一次递增的顺序放置。目标是把A塔的盘子移动到B塔借助C塔。

     

    思路:

    假设有3个塔 A,B,C

    A未初始塔,B为目标塔,C为辅助塔

    A上有3个盘子

    1.我们只需要把初始塔A的n-1个盘子移动到辅助塔C

    2.然后初始塔A的最后一个盘子移动到目标塔B

    3.这时我们解决的问题是把C的n-1个盘子移动到 B 借助A

     把C视为初始塔,B视为目标塔,A视为辅助塔

    把C移动到B借助A

    这时就完成目标。

    但是要想完成n-1个盘子的移动必须先完成n-2个盘子的移动......一直到1个盘子的移动,但是他们的过程都是这3步

     

    总结:这个的递归因子是求n个的移动,即求n-1个盘子的移动...

        结束条件是; n=1的时候结束

    代码如下:

     1 #include<stdio.h>
     2 void move(int n,char x,char y);                // 初始塔x->目标塔y 
     3 void hanoi(int n,char x,char y,char z); //x初始塔,y目标塔,c辅助塔 
     4 int i=1;
     5 int main()
     6 {
     7     int n;
     8     scanf("%d",&n);
     9     char x='A',y='B',z='C';            //塔号 
    10     hanoi(n,x,y,z);                    //目标从x移到y借助z 
    11     return 0;
    12 }
    13 void move(int n,char x,char y)            //从x移动到y
    14 {
    15     printf("%d:第%d个盘子:%c->%c
    ",i++,n,x,y);
    16  } 
    17  void hanoi(int n,char x,char y,char z)//x初始塔,y目标塔,c辅助塔 
    18  {
    19      if( n == 1 )                        //结束条件 
    20          move(n,x,y);
    21      else
    22      {
    23          hanoi(n-1,x,z,y);                //x->z借助y 
    24          move(n,x,y);                    //移动 
    25          hanoi(n-1,z,y,x);                //z->y借助x 
    26      }
    27  }
    28  

    递归最重要的是:找递归因子和结束条件

  • 相关阅读:
    串口应用
    状态栏颜色
    冒泡排序
    快速排序
    good软件测试博客地址
    软件测试面试题
    股票基础知识
    软件测试基本知识
    软件测试流程
    mycat实现分库分表(二)
  • 原文地址:https://www.cnblogs.com/hysz/p/7130837.html
Copyright © 2011-2022 走看看