• 数据结构与算法->递归


    凡人用迭代,神仙用递归。

    今天学习了熟悉而又陌生的递归,写个博客总结一下。

    以我的个人理解,递归就是函数直接或间接地调用自己,在形态上就是数学函数的直观体现。即如果给了一个问题,你可以用数学函数进行描述,那递归算法就基本上出来了。

    虽然在直观上不好理解(也可能是我的思维习惯了迭代,不习惯递归),但是反应在代码上属实简洁。

    那么什么问题适合用递归算法呢?那估计就是套娃的问题吧,如果一个问题每一步的解决方案都是类似的,那多半是适用于递归的。

    以一个实例来运用一下递归算法。

    将x轴上的圆饼,挪到z轴上,移动过程中,每次只能移动一个圆饼,且须保证大饼在下,小饼在上,最后将移动顺序输出

     分析:要实现的目的,将X轴上4个圆饼悉数挪到Z轴

    前一步:将三个圆饼,从X,借助Z轴中介,挪到Y轴;将X轴最后一个圆饼挪到Z轴;将Y轴上的三个圆饼,借助X轴做中介,挪到Z轴;

    那么如何将三个圆饼,从X,挪到Y轴?

    将两个圆饼,从X,借助Y,挪到Z轴;将第三个圆饼,从X挪到Y;将Z轴上的两个圆饼,借助X,挪到Y;

    我们发现:每一步要解决的问题,都被分解为了相似的三小步。

    写成递归算法,便如下所示。

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 //将n个盘子从X轴上,借助Y,移动到Z轴上
     6 void move(int n, char x, char y, char z)
     7 {
     8     if (n == 1)
     9         cout << x  << "-->" << z << endl;
    10     else
    11     {
    12         move(n - 1, x, z, y);
    13         cout << x << "-->" << z << endl;
    14         move(n - 1, y, x, z);
    15     }
    16 }
    17 
    18 int main()
    19 {
    20     int n;
    21     cout << "请输入汉诺塔层数:" << endl;
    22     cin >> n;
    23     cout << "执行步骤为:" << endl;
    24     move(n, 'X', 'Y', 'Z');
    25 
    26     int u;
    27     cin >> u;
    28 }

    感想:真的超难理解,欠缺递归思维。

  • 相关阅读:
    第五次作业
    第四次作业
    软件工程(第二次作业)
    读软件工程这本书的感悟(第一次作业)
    第五次作业
    软件工程第四次作业
    软件工程第二次作业
    软件工程第二次作业
    什么样的书叫做好书,大学的教育到底培养的是什么?
    软件工程学习的问题:
  • 原文地址:https://www.cnblogs.com/pgzhanglin/p/13381634.html
Copyright © 2020-2023  润新知