Fibonacci数列

Fibonacci数列是一个很有趣的结构,每后一项都等于前两项之和。它的前几位如下:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 134...我们可以表达该函数如下所示:

fib(0) = 0

fib(1) = 1

fib(n) = fib(n-1) + fib(n-2) for n >= 2

在python里如何表达这样一个函数呢?我们可以用递归来表达。所谓递归,就是一个函数不断引用它自身,直到抵达一个可计算出确定值的初始态。

def fib(n):

if n <= 1:

return n

else:

return fib(n-1) + fib(n-2)

分形结构

分形概念由法国数学家曼德布罗在1975年提出,用于形容局部与整体相似的形状。如下所示图案叫科赫雪花(Koch fractal),是一个典型的分形。

如何用计算机制造出这个图像呢?仔细观察并思考这个图像的绘制过程,我们会发现用递归的方式也能解决。我们称第一张图(只有一条直线)为0阶(order)雪花,第二张为1阶,以此类推。我们会发现,例如第二阶的图,可以通过引用三次第一阶的图来绘制。因此这个结构可以使用如下函数实现:

def koch(t, order, size):

if order == 0:

t.forward(size)

else:

for angle in [60, -120, 60, 0]:

koch(t, order-1, size/3)

t.left(angle)

其中t是一个移动的小海龟(类似netlogo里的turtle),order是层级,size是整个雪花的线性规模。如果我们不用递归,则有n阶就必须定义n个函数:

def koch_0(t, size):

t.forward(size)

def koch_1(t, size):

for angle in [60, -120, 60, 0]:

koch_0(t, size/3)

t.left(angle)

def koch_2(t, size):

for angle in [60, -120, 60, 0]:

koch_1(t, size/3)

t.left(angle)

def koch_3(t, size):

for angle in [60, -120, 60, 0]:

koch_2(t, size/3)

t.left(angle)

可见递归确实是一种非常简洁的思想。

动态演化的分形结构

我们可以使用递归函数制造出分形结构,并且不断修正其中的参数,来构造动态演化的结构.为了帮助进行动态演示,下面这段程序使用了pygame模块,安装地址见这里。

import pygame, math

pygame.init() # prepare the pygame module for use

# Create a new surface and window.

surface_size = 1024

main_surface = pygame.display.set_mode((surface_size,surface_size))

my_clock = pygame.time.Clock()

def draw_tree(order, theta, sz, posn, heading, color=(0,0,0), depth=0):

trunk_ratio = 0.29 # How big is the trunk relative to whole tree?

trunk = sz * trunk_ratio # length of trunk

delta_x = trunk * math.cos(heading)

delta_y = trunk * math.sin(heading)

(u, v) = posn

newpos = (u + delta_x, v + delta_y)

pygame.draw.line(main_surface, color, posn, newpos)

if order > 0: # Draw another layer of subtrees

# These next six lines are a simple hack to make the two major halves

# of the recursion different colors. Fiddle here to change colors

# at other depths, or when depth is even, or odd, etc.

if depth == 0:

color1 = (255, 0, 0)

color2 = (0, 0, 255)

else:

color1 = color

color2 = color

# make the recursive calls to draw the two subtrees

newsz = sz*(1 - trunk_ratio)

draw_tree(order-1, theta, newsz, newpos, heading-theta, color1, depth+1)

draw_tree(order-1, theta, newsz, newpos, heading+theta, color2, depth+1)

def gameloop():

theta = 0

while True:

# Handle evente from keyboard, mouse, etc.

ev = pygame.event.poll()

if ev.type == pygame.QUIT:

break;

# Updates - change the angle

theta += 0.01

# Draw everything

main_surface.fill((255, 255, 0))

draw_tree(9, theta, surface_size*0.9, (surface_size//2, surface_size-50), -math.pi/2)

pygame.display.flip()

my_clock.tick(120)

gameloop()

pygame.quit()

python中的递归思想_使用python语言表达分形与递归相关推荐

  1. python中的递归思想_〖Python〗-- 递归、面向对象初识及编程思想

    [递归.面向对象初识及编程思想] 一.递归 1.定义: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. (1)递归就是在过程或函数里调用自身: (2)在使用递归策 ...

  2. 简述python中面向对象的概念_简述Python中的面向对象编程的概念

    面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...

  3. python中case的用法_用 Python 实现简单的 switch/case 语句

    在Python中是没有Switch / Case语句的,很多人认为这种语句不够优雅灵活,在Python中用字典来处理多条件匹配问题字典会更简单高效,对于有一定经验的Python玩家不得不承认,的确如此 ...

  4. python中append函数解析_对python中的pop函数和append函数详解

    对python中的pop函数和append函数详解 pop()函数 1.描述 pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值. 语法 pop()方法语法: list. ...

  5. python中对列表排序_在Python中对嵌套列表进行排序和分组

    在Python中对嵌套列表进行排序和分组 我具有以下数据结构(列表列表) [ ['4', '21', '1', '14', '2008-10-24 15:42:58'], ['3', '22', '4 ...

  6. python中基本程序结构_关于Python 程序格式框架的描述,正确的是( )

    [判断题]元组的元素是可读的,可以对元组进行更新.增加.删除操作. [多选题]哪些选项关于循环结构的描述是正确的( ) [单选题]以下可以终结一个循环的是 . [判断题]对于大量列表的连接,exten ...

  7. python中类似对象吗_在Python中,两个对象什么时候相同? - python

    似乎2 is 2和3 is 3在python中始终为true,通常,对整数的任何引用都与对相同整数的任何其他引用相同. None(即None is None)也是如此.我知道用户定义类型或可变类型不会 ...

  8. python中nomodulenamed怎么解决_关于 python ImportError: No module named 的问题

    今天在 centos 下安装 python setup.py install 时报错:ImportError: No module named sysconfig, 当时急着用,就顺手直接源码编译了一 ...

  9. python中函数的调用_慢步python,编程中函数的概念,python中函数的声明和调用

    函数,曾经是一个很高大尚的概念.笔者是在高中数学里认识的函数,先是从y=2x+3 这条代数式开始的.y是因变量,x是自变量,y因为x取值的变化而变化. 再后来式子变成这样:f(x)=2x+3,f(x) ...

最新文章

  1. 计算机基础2多媒体,《计算机基础》第2章-多媒体技术.pptx
  2. 嵌入式系统降低功耗的设计技术
  3. SSM查看详情功能逻辑代码以及关联码表显示
  4. 软件定义闪存:加速闪存规模化应用
  5. Dapr + .NET 实战(八)服务监测
  6. Microsoft Windows CE .NET 中的中断体系结构
  7. LeetCode 966. 元音拼写检查器(哈希)
  8. html表单提交后显示,javascript – 在表单提交后在页面上显示消息
  9. UI设计素材模板|表单的临摹学习技巧
  10. 操作Zookeeper
  11. MySQL索引常见面试题(2022版)
  12. php抽奖中了奖品后怎么处理,抽奖程序,求思路.该怎么处理
  13. 3d建模和计算机专业对口吗,学3d建模有学历门槛吗
  14. linux下创建桌面快捷方式,简单快捷(ubuntu)
  15. 启动计算机键盘没反应,如何解决电脑开机显示屏和键盘无反应
  16. 快速沃尔什变换学习笔记
  17. UVM Primer Ch2 A Conventional Testbench for the TinyALU
  18. JetBrain学生免费全家桶
  19. 如何用c语言串口通讯,串口通信入门
  20. ADC或DAC中的LSB

热门文章

  1. [转]iPhone发邮件编程
  2. [笔记].痛哉!!!Error: Can't access JTAG chain, Error: Operation failed
  3. 团队开发-CodePlex的工作模式和团队协作开发
  4. Linux 命令(134)—— groupmod 命令
  5. C++ 以智能指针管理内存资源
  6. oracle大数据量迁移,分批量导入样例(fetch...bulk collect)以及forall结合使用
  7. MySQL orzdba、dodba、top、iostat、vmstat、perf等
  8. Week09《java程序设计》第九次作业总结
  9. Oracle 11g数据库详细安装步骤图解
  10. Leetcode 169 Majority Element