从汉诺塔看递归

    刚入门算法,首先接触到的就是递归。在网上查了一下,几乎都说递归特别简单,弄得我心里慌得不得了,我就在想:为什么我感觉递归总是不懂,这感觉不对劲啊!但也没过分追求,不懂就不懂吧,回头再说。今天有空,就把这个当初看到的汉诺塔问题写一下,总结总结,问题什么的就不多说了,直接上代码(这代码是借鉴别人的)。

#include 
using namespace std;

int m = 0;        //标记移动次数
					
void move(int disks, char N, char M) 
{
		cout<<"第" << (++m) << " 次移动 :   " << " 把 " << disks << " 号圆盘从 " << N << " ->移到->  " << M<> disks;
		hanoi(disks, A, B, C);
		cout<<"总共移动了"<< m <<"次,把A上的圆盘都移动到了C上"<

    上面的代码主要说hanoi这个函数。假设我们初始的汉诺塔个数不为1。

    函数中当n==1的判断应该都懂,就是把A上面的圆盘移到C盘上,这里也是默认把所有圆盘移动到C盘上

    当编译到第一个递归时,只要n!=1,就一直递归下去,不断地在栈(先进后出)里面存储当前函数的参数和下面的语句。当到n==1时,结束,返回到上一层的递归函数,此时对应的参数还储存在栈里面,也就说接下来的语句中的参数是储存在对应的栈里面的,上图吧。

从汉诺塔看递归_第1张图片

    因为这个递归下面还有一个递归,所以,画起来应该是二维的,所以就省去了下面递归函数的图,和这个差不多。说白了,就是把语句放到栈里面从头开始执行,对大多数可以把递归写成非递归的函数,其实可以试一试,比较一下两者的不同,对理解递归还是有帮助的。

    都说递归不好,但对于学生来说,理解理解这种思维,我觉得还是有好处的。

    楼主技术不行,不喜就喷!

你可能感兴趣的:(C/C++)