斐波那契数列的话我之前做过两期,现在做第三期了,若喜欢我的,请三连,谢谢!

import turtle
import random
from math import *  

引入turtle、random和math的所有东西

def Fibonacci_Recursion_tool(n):  #斐波那契数列方法if n <= 0:return 0elif n == 1:return 1else:return Fibonacci_Recursion_tool(n - 1) + Fibonacci_Recursion_tool(n - 2)
def Fibonacci_Recursion(n):     #生成斐波那契数列,并存入列表result_list = []for i in range(1, n + 3):result_list.append(Fibonacci_Recursion_tool(i))return result_list
yu = Fibonacci_Recursion(10)  #生成斐波契那数列
print(yu)

生成斐波那契数列,并打印出来(之前讲过)

def leaf(x, y, node):#定义画叶子的方法til = turtle.heading()i = random.random()an = random.randint(10, 180)ye = random.randint(6, 9)/10turtle.color(ye, ye*0.9, 0)turtle.fillcolor(ye+0.1, ye+0.05, 0)turtle.pensize(1)turtle.pendown()turtle.setheading(an + 90)turtle.forward(8*i)px = turtle.xcor()py = turtle.ycor()turtle.begin_fill()turtle.circle(7.5*i, 120)  # 画一段120度的弧线turtle.penup()  # 抬起笔来turtle.goto(px, py)  # 回到圆点位置turtle.setheading(an + 90)  # 向上画turtle.pendown()  # 落笔,开始画turtle.circle(-7.5*i, 120)  # 画一段120度的弧线turtle.setheading(an + 100)turtle.circle(10.5*i, 150)turtle.end_fill()  # 画一段150度的弧线turtle.penup()turtle.goto(x, y)turtle.setheading(til)turtle.pensize(node / 2 + 1)

til就是当前的角度,i就是一个0到1之间的随机数,an就是10到180之间的随机小数,ye是一个0.6到0.9之间的十位小数。

color就是使用RGB的(red,green,blue),fillcolor一样。

p.xcor就是当前turtle的x坐标,p.ycor 就是当前turtle的y坐标。

def draw(node, length, level, yu, button):  #定义画树的方法turtle.pendown()t = cos(radians(turtle.heading()+5)) / 8 + 0.25turtle.pencolor(t*1.6, t*1.2, t*1.4) #(r, g, b)颜色对应的RGB值turtle.pensize(node/1.2)  #画笔的尺寸x = random.randint(0, 10)  #生成随机数决定要画树枝还是画飘落的叶子

t = cos(radians(turtle.heading()+5)) / 8 + 0.25是生成一个小数

def draw(node, length, level, yu, button):  #定义画树的方法turtle.pendown()t = cos(radians(turtle.heading()+5)) / 8 + 0.25turtle.pencolor(t*1.6, t*1.2, t*1.4) #(r, g, b)颜色对应的RGB值turtle.pensize(node/1.2)  #画笔的尺寸x = random.randint(0, 10)  #生成随机数决定要画树枝还是画飘落的叶子if level == top and x > 10:  #此时画飘落的叶子,x范围太大会导致树太秃turtle.forward(length)  # 画树枝,length=120yu[level] = yu[level] - 1c = random.randint(2, 10)for i in range(1, c):leaf(turtle.xcor(), turtle.ycor(), node)# 添加0.3倍的飘落叶子if random.random() > 0.3:#print("随机数是",random.random())turtle.penup()  #可以用down()测试一下,当大于0.3的时候,会有和落叶的连线。#turtle.down()# 飘落t1 = turtle.heading()print("turtle.heading()",t1)# 可以用print看一下t1的值。an1 = -40 + random.random() * 40 #random.random()产生0,1之间的浮点数turtle.setheading(an1)dis = int(800 * random.random() * 0.5 + 400 * random.random() * 0.3 + 200 * random.random() * 0.2)#上面的800 * random.random() * 0.5是turtle.forward(dis)turtle.setheading(t1)turtle.right(90)# 画叶子leaf(turtle.xcor(), turtle.ycor(), node)turtle.left(90)# 返回t2 = turtle.heading()turtle.setheading(an1)turtle.backward(dis)turtle.setheading(t2)elif level==top and x < 7 : #此时画枝叶,x范围太大会导致飘落的叶子太少turtle.penup()turtle.forward(length)elif level>3 and x>6 :#三级树枝以上,有40%的概率执行以下策略turtle.pendown()turtle.forward(length)c = random.randint(4, 6)for i in range(3, c):leaf(turtle.xcor(), turtle.ycor(),node)leaf(turtle.xcor(), turtle.ycor(),node)#button=1else:turtle.forward(length)  # 画树枝yu[level] = yu[level] -1if node > 0 and button == 0:# 计算右侧分支偏转角度,在固定角度偏转增加一个随机的偏移量right = random.random() * 5 + 17# 计算左侧分支偏转角度,在固定角度偏转增加一个随机的偏移量left = random.random() * 20 + 19# 计算下一级分支的长度child_length = length * (random.random() * 0.25 + 0.7)# 右转一定角度,画右分支       r=random.randint(0, 1)if r==1:turtle.right(right)level = level + 1#print("level", level)else:turtle.left(right)level = level + 1#print("level", level)          draw(node - 1, child_length,level,yu,button)  #递归调用自己。yu[level] = yu[level] +1if yu[level] > 1:# 左转一定角度,画左分支if r==1:turtle.left(right + left)draw(node - 1, child_length, level, yu,button)# 将偏转的角度,转回turtle.right(left)yu[level] = yu[level] - 1else:turtle.right(right + left)draw(node - 1, child_length, level, yu,button)# 将偏转的角度,转回turtle.left(left)yu[level] = yu[level] - 1else:if r==1:turtle.left(right + left)turtle.right(left)else:turtle.right(right + left)turtle.left(left)turtle.penup()#退回到上一级节点顶部位置turtle.backward(length)

每执行一次,yu[level]会减一,当随机数小于0.3之后才会执行一大部分代码(%30可能性)

t1就是当前的笔头朝向,int保证了dis是整数,之后t就是那时的笔头朝向

如果top是level且x是7,random.randint(4,6)就是在4和6之间取随机数,leaf那边是一个递归,yu[level]也是,之后的level=level+1一样,反正有什么=什么+几,TA就是递归调用自己的地方。

之后length变成child_length,node减一,其他不变。

turtle.penup()#退回到上一级节点顶部位置turtle.backward(length)
"""
5.主函数部分
主函数中直接调用上述函数就行,top控制树的高度,turtle.speed控制画的速度,最后的turtle.write()用来书写最下方的签名。```clike
"""
if __name__ == '__main__':turtle.setup(width=1.0, height=1.0) #设置全屏显示turtle.hideturtle()  # 隐藏turtleturtle.speed(0)  # 设置画笔移动的速度,0-10 值越小速度越快# turtle.tracer(0,0)      #设置动画的开关和延迟,均为0turtle.penup()  # 抬起画笔turtle.left(90)  # 默认方向为朝x轴的正方向,左转90度则朝上turtle.backward(300)  # 设置turtle的位置,朝下移动300top = 8  #树高yu = Fibonacci_Recursion(top)  #生成斐波那契数列yu.remove(yu[0])print(yu) #打印斐波那契数列button = 0draw(top, 120, 0, yu, button)  # 调用函数开始绘制turtle.write("      朱子轩", font=("宋体", 14, "normal")) #生成签名turtle.done()

把width定义为1,hight定义为1,把笔头朝上,后退300步,top定义为8,yu是一个斐波那契数列,再签上自己的名字。

全部代码:

import turtle
import random
turtle.speed(0)
from math import *  # *代表所有内容
print(turtle.heading())
def Fibonacci_Recursion_tool(n):  #斐波那契数列方法if n <= 0:return 0elif n == 1:return 1else:return Fibonacci_Recursion_tool(n - 1) + Fibonacci_Recursion_tool(n - 2)
def Fibonacci_Recursion(n):     #生成斐波那契数列,并存入列表result_list = []for i in range(1, n + 3):result_list.append(Fibonacci_Recursion_tool(i))return result_list
yu = Fibonacci_Recursion(10)  #生成斐波契那数列
print(yu)
def leaf(x, y, node):#定义画叶子的方法til = turtle.heading()i = random.random()an = random.randint(10, 180)ye = random.randint(6, 9)/10turtle.color(ye, ye*0.9, 0)turtle.fillcolor(ye+0.1, ye+0.05, 0)turtle.pensize(1)turtle.pendown()turtle.setheading(an + 90)turtle.forward(8*i)px = turtle.xcor()py = turtle.ycor()turtle.begin_fill()turtle.circle(7.5*i, 120)  # 画一段120度的弧线turtle.penup()  # 抬起笔来turtle.goto(px, py)  # 回到圆点位置turtle.setheading(an + 90)  # 向上画turtle.pendown()  # 落笔,开始画turtle.circle(-7.5*i, 120)  # 画一段120度的弧线turtle.setheading(an + 100)turtle.circle(10.5*i, 150)turtle.end_fill()  # 画一段150度的弧线turtle.penup()turtle.goto(x, y)turtle.setheading(til)turtle.pensize(node / 2 + 1)
def draw(node, length, level, yu, button):  #定义画树的方法turtle.pendown()t = cos(radians(turtle.heading()+5)) / 8 + 0.25turtle.pencolor(t*1.6, t*1.2, t*1.4) #(r, g, b)颜色对应的RGB值turtle.pensize(node/1.2)  #画笔的尺寸x = random.randint(0, 10)  #生成随机数决定要画树枝还是画飘落的叶子if level == top and x > 10:  #此时画飘落的叶子,x范围太大会导致树太秃turtle.forward(length)  # 画树枝,length=120yu[level] = yu[level] - 1c = random.randint(2, 10)for i in range(1, c):leaf(turtle.xcor(), turtle.ycor(), node)# 添加0.3倍的飘落叶子if random.random() > 0.3:#print("随机数是",random.random())turtle.penup()  #可以用down()测试一下,当大于0.3的时候,会有和落叶的连线。#turtle.down()# 飘落t1 = turtle.heading()print("turtle.heading()",t1)# 可以用print看一下t1的值。an1 = -40 + random.random() * 40 #random.random()产生0,1之间的浮点数turtle.setheading(an1)dis = int(800 * random.random() * 0.5 + 400 * random.random() * 0.3 + 200 * random.random() * 0.2)#上面的800 * random.random() * 0.5是turtle.forward(dis)turtle.setheading(t1)turtle.right(90)# 画叶子leaf(turtle.xcor(), turtle.ycor(), node)turtle.left(90)# 返回t2 = turtle.heading()turtle.setheading(an1)turtle.backward(dis)turtle.setheading(t2)elif level==top and x < 7 : #此时画枝叶,x范围太大会导致飘落的叶子太少turtle.penup()turtle.forward(length)elif level>3 and x>6 :#三级树枝以上,有40%的概率执行以下策略turtle.pendown()turtle.forward(length)c = random.randint(4, 6)for i in range(3, c):leaf(turtle.xcor(), turtle.ycor(),node)leaf(turtle.xcor(), turtle.ycor(),node)#button=1else:turtle.forward(length)  # 画树枝yu[level] = yu[level] -1if node > 0 and button == 0:# 计算右侧分支偏转角度,在固定角度偏转增加一个随机的偏移量right = random.random() * 5 + 17# 计算左侧分支偏转角度,在固定角度偏转增加一个随机的偏移量left = random.random() * 20 + 19# 计算下一级分支的长度child_length = length * (random.random() * 0.25 + 0.7)# 右转一定角度,画右分支       r=random.randint(0, 1)if r==1:turtle.right(right)level = level + 1#print("level", level)else:turtle.left(right)level = level + 1#print("level", level)          draw(node - 1, child_length,level,yu,button)  #递归调用自己。yu[level] = yu[level] +1'''if yu[level] > 1:# 左转一定角度,画左分支if r==1:turtle.left(right + left)draw(node - 1, child_length, level, yu,button)# 将偏转的角度,转回turtle.right(left)yu[level] = yu[level] - 1else:turtle.right(right + left)draw(node - 1, child_length, level, yu,button)# 将偏转的角度,转回turtle.left(left)yu[level] = yu[level] - 1else:if r==1:turtle.left(right + left)turtle.right(left)else:turtle.right(right + left)turtle.left(left)'''   turtle.penup()#退回到上一级节点顶部位置turtle.backward(length)
"""
5.主函数部分
主函数中直接调用上述函数就行,top控制树的高度,turtle.speed控制画的速度,最后的turtle.write()用来书写最下方的签名。```clike
"""
if __name__ == '__main__':turtle.setup(width=1.0, height=1.0) #设置全屏显示turtle.hideturtle()  # 隐藏turtleturtle.speed(0)  # 设置画笔移动的速度,0-10 值越小速度越快# turtle.tracer(0,0)      #设置动画的开关和延迟,均为0turtle.penup()  # 抬起画笔turtle.left(90)  # 默认方向为朝x轴的正方向,左转90度则朝上turtle.backward(300)  # 设置turtle的位置,朝下移动300top = 8  #树高yu = Fibonacci_Recursion(top)  #生成斐波那契数列yu.remove(yu[0])print(yu) #打印斐波那契数列button = 0draw(top, 120, 0, yu, button)  # 调用函数开始绘制turtle.write("      朱子轩", font=("宋体", 14, "normal")) #生成签名turtle.done()

只不过,这是一棵很秃的树......

改进版:

import turtle
import random
turtle.speed(0)
from math import *  # *代表所有内容
print(turtle.heading())
def Fibonacci_Recursion_tool(n):  #斐波那契数列方法if n <= 0:return 0elif n == 1:return 1else:return Fibonacci_Recursion_tool(n - 1) + Fibonacci_Recursion_tool(n - 2)
def Fibonacci_Recursion(n):     #生成斐波那契数列,并存入列表result_list = []for i in range(1, n + 3):result_list.append(Fibonacci_Recursion_tool(i))return result_list
yu = Fibonacci_Recursion(10)  #生成斐波契那数列
print(yu)
def leaf(x, y, node):#定义画叶子的方法til = turtle.heading()i = random.random()an = random.randint(10, 180)ye = random.randint(6, 9)/10turtle.color(ye, ye*0.9, 0)turtle.fillcolor(ye+0.1, ye+0.05, 0)turtle.pensize(1)turtle.pendown()turtle.setheading(an + 90)turtle.forward(8*i)px = turtle.xcor()py = turtle.ycor()turtle.begin_fill()turtle.circle(7.5*i, 120)  # 画一段120度的弧线turtle.penup()  # 抬起笔来turtle.goto(px, py)  # 回到圆点位置turtle.setheading(an + 90)  # 向上画turtle.pendown()  # 落笔,开始画turtle.circle(-7.5*i, 120)  # 画一段120度的弧线turtle.setheading(an + 100)turtle.circle(10.5*i, 150)turtle.end_fill()  # 画一段150度的弧线turtle.penup()turtle.goto(x, y)turtle.setheading(til)turtle.pensize(node / 2 + 1)
def draw(node, length, level, yu, button):  #定义画树的方法turtle.pendown()t = cos(radians(turtle.heading()+5)) / 8 + 0.25turtle.pencolor(t*1.6, t*1.2, t*1.4) #(r, g, b)颜色对应的RGB值turtle.pensize(node/1.2)  #画笔的尺寸x = random.randint(0, 10)  #生成随机数决定要画树枝还是画飘落的叶子if level == top and x > 10:  #此时画飘落的叶子,x范围太大会导致树太秃turtle.forward(length)  # 画树枝,length=120yu[level] = yu[level] - 1c = random.randint(2, 10)for i in range(1, c):leaf(turtle.xcor(), turtle.ycor(), node)# 添加0.3倍的飘落叶子if random.random() > 0.3:#print("随机数是",random.random())turtle.penup()  #可以用down()测试一下,当大于0.3的时候,会有和落叶的连线。#turtle.down()# 飘落t1 = turtle.heading()print("turtle.heading()",t1)# 可以用print看一下t1的值。an1 = -40 + random.random() * 40 #random.random()产生0,1之间的浮点数turtle.setheading(an1)dis = int(800 * random.random() * 0.5 + 400 * random.random() * 0.3 + 200 * random.random() * 0.2)#上面的800 * random.random() * 0.5是turtle.forward(dis)turtle.setheading(t1)turtle.right(90)# 画叶子leaf(turtle.xcor(), turtle.ycor(), node)turtle.left(90)# 返回t2 = turtle.heading()turtle.setheading(an1)turtle.backward(dis)turtle.setheading(t2)elif level==top and x < 7 : #此时画枝叶,x范围太大会导致飘落的叶子太少turtle.penup()turtle.forward(length)elif level>3 and x>6 :#三级树枝以上,有40%的概率执行以下策略turtle.pendown()turtle.forward(length)c = random.randint(4, 6)for i in range(3, c):leaf(turtle.xcor(), turtle.ycor(),node)leaf(turtle.xcor(), turtle.ycor(),node)#button=1else:turtle.forward(length)  # 画树枝yu[level] = yu[level] -1if node > 0 and button == 0:# 计算右侧分支偏转角度,在固定角度偏转增加一个随机的偏移量right = random.random() * 5 + 17# 计算左侧分支偏转角度,在固定角度偏转增加一个随机的偏移量left = random.random() * 20 + 19# 计算下一级分支的长度child_length = length * (random.random() * 0.25 + 0.7)# 右转一定角度,画右分支       r=random.randint(0, 1)if r==1:turtle.right(right)level = level + 1#print("level", level)else:turtle.left(right)level = level + 1#print("level", level)          draw(node - 1, child_length,level,yu,button)  #递归调用自己。yu[level] = yu[level] +1if yu[level] > 1:# 左转一定角度,画左分支if r==1:turtle.left(right + left)draw(node - 1, child_length, level, yu,button)# 将偏转的角度,转回turtle.right(left)yu[level] = yu[level] - 1else:turtle.right(right + left)draw(node - 1, child_length, level, yu,button)# 将偏转的角度,转回turtle.left(left)yu[level] = yu[level] - 1else:if r==1:turtle.left(right + left)turtle.right(left)else:turtle.right(right + left)turtle.left(left)turtle.penup()#退回到上一级节点顶部位置turtle.backward(length)
"""
5.主函数部分
主函数中直接调用上述函数就行,top控制树的高度,turtle.speed控制画的速度,最后的turtle.write()用来书写最下方的签名。```clike
"""
if __name__ == '__main__':turtle.setup(width=1.0, height=1.0) #设置全屏显示turtle.hideturtle()  # 隐藏turtleturtle.speed(0)  # 设置画笔移动的速度,0-10 值越小速度越快# turtle.tracer(0,0)      #设置动画的开关和延迟,均为0turtle.penup()  # 抬起画笔turtle.left(90)  # 默认方向为朝x轴的正方向,左转90度则朝上turtle.backward(300)  # 设置turtle的位置,朝下移动300top = 8  #树高yu = Fibonacci_Recursion(top)  #生成斐波那契数列yu.remove(yu[0])print(yu) #打印斐波那契数列button = 0draw(top, 120, 0, yu, button)  # 调用函数开始绘制turtle.write("      朱子轩", font=("宋体", 14, "normal")) #生成签名turtle.done()

结果:

用斐波那契数列绘画银杏树相关推荐

  1. 用PYTHON画斐波那契数列银杏树(代码可复制)

    今天我们来画斐波那契数列银杏树,先看一下结果: 首先,我们先引入turtle,random,math三个包. import turtle import random import math 斐波那契数 ...

  2. 斐波那契数列的各种求法

    斐波那契数列百科名片 "斐波那契数列"是意大利数学家列昂纳多·斐波那契首先研究的一种递归数列, 它的每一项都等于前两项之和. 此数列的前几项为1,1,2,3,5等等. 在生物数学中 ...

  3. python斐波那契数列第四十项_传统文化的数学基础(四)--论八卦、五行、天干地支、二十四节气、洛书与黄金分...

    (原著 横山春雨) 六.关于斐波那契数列和黄金分割数的其它知识: 斐波那契数列描述了大自然趋向于和谐美的自然规律,许多植物的叶片.花瓣.果粒数与斐波那契数列相吻合.例如,沿螺旋前伸的树叶分布.松果上的 ...

  4. java 斐波拉_Java实现斐波那契数列

    斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n&g ...

  5. 剑指offer:面试题10- I. 斐波那契数列

    写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 ...

  6. 用递归法计算斐波那契数列的第n项

     斐波纳契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1, ...

  7. 循环斐波那契数列_剑指offer #10 斐波那契数列

    (递归和循环)#10 斐波那契数列 一.斐波那契数列 定义: n = 0 , f(n) = 0 n = 1 , f(n) = 1 n > 1 , f(n) = f(n-1) + f(n-2) 思 ...

  8. 用C语言编写:判断一个≥2的整型数是否存在于斐波那契数列中?

    自己写的,感觉挺有成就感的,就展示出来吧! 判断一个≥2的整型数是否存在于斐波那契数列中? 若存在,则返回第几项:若不在,则返回-1 #include <stdio.h> long gen ...

  9. 算法(1)斐波那契数列

    1.0 问题描述 实现斐波那契数列,求第N项的值 2.0 问题分析 斐波那契数列最简单的方法是使用递归,递归和查表法同时使用,可以降低复杂度. 根据数列特点,同时进行计算的数值其实只有3个,所以可以使 ...

  10. NOIP模拟题 斐波那契数列

    题目大意 给定长度为$n$序列$A$,将它划分成尽可能少的若干部分,使得任意部分内两两之和均不为斐波那契数列中的某一项. 题解 不难发现$2\times 10^9$之内的斐波那契数不超过$50$个 先 ...

最新文章

  1. ubuntu16.0.4 opencv4.0.0 yolov3测试
  2. MIME 类型(HttpContext.Response.ContentType)列表
  3. IPv6 — 协议头
  4. 【Java】MyBatis与Spring框架整合(一)
  5. 常用抓包工具(可编程抓包工具)
  6. boost::hana::value_or用法的测试程序
  7. jQuery |淡入淡出
  8. mysql课件_MYSQL讲课时的PPT课件.ppt
  9. 文本处理命令--uniq
  10. xtreme toolkit pro——CXTPReportControl控件教程
  11. 夏普Sharp AR-6120N 一体机驱动
  12. 消极和积极的道德--给亲爱的安德烈
  13. 山东移动服务器密码修改,移动服务器山东 dns地址
  14. pandas——分组与聚合
  15. 浅析分布式数据库同步技术理论
  16. 农业借助拼多多的东风实现数字化-纽黑文教育
  17. 最长递增子序列 java_最长递增子序列问题---动态规划
  18. 放大招!百味勺子硬件设计篇
  19. 使用Java完成网上支付(1. 银联)
  20. host, origin, referrer的区别

热门文章

  1. 投资速度对天使投资人很重要——九合创投王啸
  2. 二进制高可用安装k8s集群部署
  3. SpringBoot中怎么访问静态图片
  4. IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
  5. Excel数据分析入门-数据透视表
  6. 盗版windows7危害大
  7. 服务器怎么不用绑定域名搭建网站,一个空间放两个网站,且不用子目录绑定域名的方法...
  8. 墨尔本大学计算机科学博士怎么样,墨尔本大学计算机科学专业怎么样?成为IT大牛的不二之选...
  9. 【转载】Android系统裁剪方法
  10. 面试技巧-面试官的考题