数据结构与算法->递归

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

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

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

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

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

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

将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 }

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

 

posted @ 2020-07-26 19:42  ZyLin-ux  阅读(141)  评论(0编辑  收藏  举报