在程序中,程序自身调用自身的这种技巧称为递归。我们来通俗的讲一下递归,从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山…我们小时候应该都听过这样的故事,大家想想,这个故事如果以我们程序的思维来看是不是递归?当然,这的确很想递归,因为老和尚在一直讲故事,这就像在调用自身老和尚讲故事这个函数,但我要告诉大家的是,放在我们程序里,这还真的不叫递归!我们总是认为递归就是不断的调用自己,但事实上我们忽略了一个重要的条件,程序中的递归应该有终止条件,如果没有终止条件,其实就不算程序,更别说程序中的递归了。
那么,什么样的程序叫递归呢?
1:分形树的绘制:
其实学过python的猿友们,应该很清楚分形树,我们这里应用python中的turtle可以来实现分形树的绘制,并利用了递归的逻辑思维。就是应用递归的思想来实现的,我的代码如下,程序比较模块化,可以帮助理解:
''' designer : 蒋光道 function : 绘制分形树 version : 1.0 date : 26/07/2020 ''' import turtle def draw_tree(length) : if length < 5 : turtle.color('green') if length > 5 : #绘制右侧侧树枝 turtle.forward(length) print('向前走',length) turtle.right(20) print('向右转20度') draw_tree(length - 15) #绘制左侧树枝 turtle.left(40) print('向左转40度') draw_tree(length - 15) turtle.right(20) print('向右转20度') turtle.back(length) print('向后退',length) turtle.color('brown') pass def main() : pass turtle.penup() turtle.left(90) turtle.back(100) turtle.pendown() turtle.screensize(800,600,'black') turtle.pensize(2) length = 100 draw_tree(length) turtle.done() if __name__ == '__main__' : main()
运行结果如下,这里我填充了背景为黑色
:2:汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。总会有僧人来移动圆盘,据说当圆盘移动完之后就是世界崩塌之日,世界就会毁灭。
故事是这样的。我们来看具体的程序:
“”" designer : 蒋光道 version : 1.0 function : 解决汉诺塔问题 date : 2020 / 07 / 27 “”" print(‘一张盘一张盘地进行移动’) def move(n, a, b, c): if(n == 1):
print("将{}柱子上的盘移动到{}柱子上".format(a,c)) return move(n-1, a, c, b) move(1, a, b, c) move(n-1, b, a, c)
def main(): pass dish = input(‘请输入盘数:’) dish_number = eval(dish) move(dish_number, “a”, “b”, “c”) print(‘移动完毕’) if name == ‘main’ : main()
大家理解这种问题不要太转进去,我们要有这种思维,就是大事化小的思维,用小递归的其中一部分来理解整体,因为整体和部分的实现原理一样。
下面来看测试:
欢迎大家积极留言,如有疏漏,还请指点,祝大家学好编程。