• 【我和Python算法的初相遇】——体验递归的可视化篇


    🌈个人主页: Aileen_0v0
    🔥系列专栏:PYTHON数据结构与算法学习系列专栏
    💫"没有罗马,那就自己创造罗马~" 

    目录

    递归的起源

    什么是递归?

     利用递归解决列表求和问题

    递归三定律

    递归应用-整数转换为任意进制数

    递归可视化 

    画一个正方形 

    画一个五角星 

    画一个九边形 

    画圆形

    画一个等腰三角形 

    利用递归画一个螺旋 

    利用递归画一颗分形树 

    利用递归画一个谢尔平斯基三角形


    递归的起源

    递归是一种算法,它利用函数的自身调用来解决问题。递归的历史可以追溯到古代的数学家和逻辑学家,如希腊哲学家亚里士多德和印度数学家阿耶尔巴塔。然而,递归算法的实际应用可以追溯到早期的计算机科学,尤其是在20世纪40年代和50年代的计算机发展初期。

    在20世纪初,数学家David Hilbert提出了“希尔伯特问题”,其中包括一个著名的问题——哥德尔不完备定理。这个定理表明,任何一个形式化的系统都无法证明自身完备。这导致了一些数学家开始研究递归函数,因为递归函数是一种强大的工具,可以用来刻画数学中的可计算性概念。在20世纪40年代,递归理论被广泛研究,它为计算机科学的发展奠定了基础。

    早期计算机(如ENIAC)是通过执行单个指令来执行操作的,因此递归算法在这些机器上的执行效率较低。然而,随着计算机硬件和编程语言的发展,递归算法变得更加普遍和有效。今天,递归算法被广泛用于计算机科学中的许多应用领域,如数据结构设计、图像处理、机器学习和自然语言处理。


    什么是递归?

    递归是一种解决问题的方法,其精髓在于将问题分解为规模更小的相同问题持续分解,直到问题规模小到可以用非常简单直接的方式来解决。
    递归的问题分解方式非常独特,其算法方面的明显特征就是:在算法流程中调用自身
    递归为我们提供了一种对复杂问题的优雅解决方案,精妙的递归算法常会出奇简单令人赞叹。

    问题:

    给定一个列表,返回所有数的和列表中数的个数不定,需要一个循环和一个累加变量来迭代求和

    1. def Listsum(nl):
    2. sum = 0
    3. for i in nl:
    4. sum += i
    5. return sum
    6. print(Listsum([1,2,3,4]))

     利用递归解决列表求和问题


    程序很简单,但假如没有循环语句 ?既不能用for,也不能用while还能对不确定长度的列表求和么?

     


    递归三定律

    1.结束条件

    2.向基态前进

    3.自己调用自己


    递归应用-整数转换为任意进制数

    我们用最熟悉的十进制分析下这个问题

    十进制有十个不同符号: convString =0123456789"
    比十小的整数,转换成十进制
    直接查表就可以了: convString[n] 

    比十大的整数想办法把比十大的整数拆成一系列比十小的整数,逐个查表
    比如七百六十九,拆成七、六、九,查表得到769就可以了

    所以,在递归三定律里,我们找到了“,就是小于十的整数本结束条件”

    拆解整数的过程就是向“基本结束条件”演进的过程
    我们用整数除,和求余数两个计算来
    将整数一步步拆开除以“进制基base(// base)对“进制基”求余数 (% base)

    1. #n为转换的数字 base为进制数
    2. def tostring(n,base):
    3. coverstring = "0123456789"
    4. if n < base :
    5. return coverstring[n]
    6. else:
    7. return tostring(n // base , base) + coverstring[n % base]
    8. print(tostring(1999,10))


    递归可视化 


    画一个正方形 

    1. import turtle
    2. t = turtle.Turtle()
    3. #通过四次向右转90度画一个边长为100的正方形
    4. for i in range(4):
    5. t.forward(100)
    6. t.right(90)
    7. turtle.done()

     

    画一个五角星 

    1. #画五角星
    2. import turtle
    3. t = turtle.Turtle()
    4. t.pencolor("red")
    5. t.pensize(3)
    6. for i in range(5):
    7. t.forward(100)
    8. t.right(144)
    9. t.hideturtle()
    10. turtle.done()


    画一个九边形 

    1. #画九边形
    2. import turtle
    3. t = turtle.Turtle()
    4. t.pencolor("blue")
    5. t.pensize(10)
    6. for i in range(9):
    7. t.forward(100)
    8. t.left(320)
    9. t.hideturtle()
    10. turtle.done()


    画圆形

    1. #画圆形
    2. import turtle
    3. t = turtle.Turtle()
    4. t.pencolor("blue")
    5. t.pensize(10)
    6. for i in range(1):
    7. t.circle(180)
    8. t.hideturtle()
    9. turtle.done()


    画一个等腰三角形 

    #画等腰三角形
    import turtle
    t = turtle.Turtle()
    t.pencolor("blue")
    t.pensize(10)
    for i in range(4):
        t.forward(100)
        t.left(120)
    t.hideturtle()
    turtle.done()


    利用递归画一个螺旋 

    1. #内置库,用于画图的模块
    2. import turtle
    3. #实例化turtle对象
    4. my_turtle = turtle.Turtle()
    5. #调用窗口
    6. my_win = turtle.Screen()
    7. def draw_spiral(my_turtle,line_len):
    8. if line_len > 0:
    9. # 向当前方向走line_len 个像素
    10. my_turtle.forward(line_len)
    11. #箭头向右转90度
    12. my_turtle.left(90)
    13. #调用自己
    14. draw_spiral(my_turtle,line_len - 5)
    15. #♥这个图告诉我们递归不一定要有返回值
    16. draw_spiral(my_turtle,300)
    17. my_win.exitonclick()


    利用递归画一颗分形树 

    1. def tree(branch_len, t):
    2. if branch_len > 5:
    3. t.forward(branch_len)
    4. t.right(20)
    5. tree(branch_len-15, t)
    6. t.left(40)
    7. tree(branch_len-15, t)
    8. t.right(20)
    9. t.backward(branch_len)
    10. import turtle
    11. t = turtle.Turtle()
    12. my_win = turtle.Screen()
    13. t.left(90)
    14. t.up()
    15. t.backward(200)
    16. t.down()
    17. t.color("black")
    18. tree(110,t)
    19. my_win.exitonclick()

     


    利用递归画一个谢尔平斯基三角形

    1. #绘制谢尔平斯基三角形的辅助函数
    2. import turtle
    3. def draw_triangle(points , color, my_turtle ):
    4. my_turtle.fillcolor ( color )
    5. my_turtle.up()
    6. my_turtle.goto(points[0][0],points[0][1])
    7. my_turtle.down()
    8. my_turtle.begin_fill()
    9. my_turtle.goto(points[1][0],points [1][1])
    10. my_turtle.goto(points[2][0],points [2][1])
    11. my_turtle.goto(points[0][0],points [0][1])
    12. my_turtle.end_fill()
    13. def get_mid(p1,p2 ):
    14. return ((p1[0] + p2[0]) / 2 , (p1[1] + p2[1]) / 2)
    15. # 绘制谢尔平斯基三角形
    16. def sierpinski(points, degree, my_turtle):
    17. colormap = [
    18. "blue",
    19. "red",
    20. "green",
    21. "white",
    22. "yellow",
    23. "violet",
    24. "orange",
    25. ]
    26. draw_triangle(points, colormap[degree], my_turtle)
    27. if degree > 0:
    28. sierpinski(
    29. [
    30. points[0],
    31. get_mid(points[0], points[1]),
    32. get_mid(points[0], points[2]),
    33. ],
    34. degree - 1,
    35. my_turtle,
    36. )
    37. sierpinski(
    38. [
    39. points[1],
    40. get_mid(points[0],points[1]),
    41. get_mid(points[1],points[2]),
    42. ],
    43. degree - 1,
    44. my_turtle,
    45. )
    46. sierpinski(
    47. [
    48. points[2],
    49. get_mid(points[2],points[1]),
    50. get_mid(points[0],points[2]),
    51. ],
    52. degree - 1,
    53. my_turtle,
    54. )
    55. def main():
    56. my_turtle = turtle.Turtle()
    57. my_win = turtle.Screen()
    58. my_points = [[-100,-50],[0,100],[100,-50]]
    59. sierpinski(my_points, 5, my_turtle)
    60. my_win.exitonclick()
    61. print(main())

     

    📝全文总结

    本文主要讲解:
        本文主要讲解了递归的历史起源以及使用规则 —— 我们通过递归可以将复杂问题简单化,并且我们还学习了如何通过递归进行进制转换,以及如何通过递归去画出我们想要的图形---螺旋图,分形树,谢尔基三角形。

         今天的干货分享到这里就结束啦!如果觉得文章还可以的话,希望能给个三连支持一下,Aileen的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就我前进的最大动力!

     

  • 相关阅读:
    Chapter5:Additional Control Information
    服务的追踪-Sleuth
    线程池的4种拒绝策略
    自学(网络安全)黑客——高效学习2024
    KT148A语音芯片驱动8欧0.5W的喇叭声音小可以换喇叭或者外挂功放吗
    神经网络 01(介绍)
    转录组分析小故事丨什么是RNAseq?
    智能油井在线监控解决方案,第一时间掌握所有动态
    计算机毕业设计选题推荐-springboot 企业在线培训系统
    电脑硬盘分区表的两种格式:MBR 和 GPT
  • 原文地址:https://blog.csdn.net/Aileenvov/article/details/134420297