递归算法的典型程序,分形树的绘制和汉诺塔的问题解决。

简介: 在程序中,程序自身调用自身的这种技巧称为递归。我们来通俗的讲一下递归,从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山…我们小时候应该都听过这样的故事,大家想想,这个故事如果以我们程序的思维来看是不是递归?当然,这的确很想递归,因为老和尚在一直讲故事,这就像在调用自身老和尚讲故事这个函数,但我要告诉大家的是,

在程序中,程序自身调用自身的这种技巧称为递归。我们来通俗的讲一下递归,从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山…我们小时候应该都听过这样的故事,大家想想,这个故事如果以我们程序的思维来看是不是递归?当然,这的确很想递归,因为老和尚在一直讲故事,这就像在调用自身老和尚讲故事这个函数,但我要告诉大家的是,放在我们程序里,这还真的不叫递归!我们总是认为递归就是不断的调用自己,但事实上我们忽略了一个重要的条件,程序中的递归应该有终止条件,如果没有终止条件,其实就不算程序,更别说程序中的递归了。


那么,什么样的程序叫递归呢?


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()


运行结果如下,这里我填充了背景为黑色


2020081309070827.png


: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()


大家理解这种问题不要太转进去,我们要有这种思维,就是大事化小的思维,用小递归的其中一部分来理解整体,因为整体和部分的实现原理一样。


下面来看测试:


20200813092152587.png


欢迎大家积极留言,如有疏漏,还请指点,祝大家学好编程。

相关文章
|
22天前
|
机器学习/深度学习 算法 搜索推荐
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
|
1月前
|
机器学习/深度学习 算法 数据挖掘
请解释Python中的决策树算法以及如何使用Sklearn库实现它。
决策树是监督学习算法,常用于分类和回归问题。Python的Sklearn库提供了决策树实现。以下是一步步创建决策树模型的简要步骤:导入所需库,加载数据集(如鸢尾花数据集),划分数据集为训练集和测试集,创建`DecisionTreeClassifier`,训练模型,预测测试集结果,最后通过`accuracy_score`评估模型性能。示例代码展示了这一过程。
|
1月前
|
机器学习/深度学习 算法
随机森林算法是如何通过构建多个决策树并将它们的预测结果进行投票来做出最终的预测的?
【2月更文挑战第28天】【2月更文挑战第102篇】随机森林算法是如何通过构建多个决策树并将它们的预测结果进行投票来做出最终的预测的?
|
3月前
|
算法 容器
数据结构与算法之树的遍历
树的 “前” “中” “后” 遍历 //如果要再写一个树太费时间了,所以博主在这篇博客只给出核心代码并赋予GIF演示动画,望大家好好理解以对树的三种遍历方式有更为深刻的理解
44 0
|
1天前
|
机器学习/深度学习 算法 数据挖掘
R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病
R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病
|
8天前
|
机器学习/深度学习 算法 数据可视化
样条曲线、决策树、Adaboost、梯度提升(GBM)算法进行回归、分类和动态可视化
样条曲线、决策树、Adaboost、梯度提升(GBM)算法进行回归、分类和动态可视化
13 0
|
8天前
|
算法 DataX
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
|
1月前
|
机器学习/深度学习 数据采集 算法
Python基础算法解析:决策树
Python基础算法解析:决策树
36 8
|
1月前
|
机器学习/深度学习 数据采集 算法
实现机器学习算法(如:决策树、随机森林等)。
实现机器学习算法(如:决策树、随机森林等)。
25 0
|
2月前
|
监控 算法 测试技术
【动态规划】【树形dp】【C++算法】968监控二叉树
【动态规划】【树形dp】【C++算法】968监控二叉树