我发现递归真是一个神奇而又伟大的东西。
1.先说一下我对递归的理解:
理解递归要分两步:写出递归和验证递归
我觉得前者比后者容易许多
写出递归:只需要考虑最简单情况和最初始情况,至于如何层层调用,他的中间过程不需要深度考虑
些递归函数时分类讨论十分重要,要有最简单情况(可能多个),和需要调用自身的情况
只想第一步如何做就差不多了,第一步分好的子块就交给程序自己执行就好
验证递归:需要理解每一步,包括子块,子块的子块。。。程序是如何运行的
让大脑模拟程序的执行想通整个过程的每一步是比较困难的
为了不会思维凌乱,要牢记规则,把栈画出来
规则:念出来,顶为当前正在执行的,顶的反址是下面的cell的
语句标号,执行后回到前一个栈的该标号位置继续执行前一个栈,
当某一层函数完全执行完了才出栈
eg.回到3,a,b,c所在的第五行开始执行
所以说,要是想快速写出递归函数就不要想“验证递归的过程”,只想第一步就好,后面的交给程序自己执行
2.对汉诺塔的理解:
汉诺塔是对递归的应用
(hannoi函数代表把多个整体移动,因为不现实,所以要把规模缩小到可以用move,move一次只移动一个盘子)
先想如何从初始状态利用规则直接变成目标状态?s1.把前n-1个先移到中间柱,s2.再把第n个移到右柱,s3.最后把n-1个也移到后柱,如语句4-6
而s1,s3不现实,然后就要想我要怎么才能把n-1个先移到中间柱(新的目标状态)(如何达到新的目标状态),怎么才能把n-1个也移到后柱(新的目标状态)?这时问题的规模就缩小了,而规则还是没变,所以可以使用递归完成,。。。。。一直缩小规模直到能move