更像的斐波那切数列

博客提到之前介绍了斐波那契数列的画法,但该画法呈现的效果与现实中向日葵排列情况不太相符,为使画出的效果更接近现实,对画法进行了改动。

上条说了斐波那切数列的画法。不过不太像我们现实中的向日葵的排列情况。
为了画的更像一些我们又改动了一下。
在这里插入图片描述

from turtle import *
from random import random,randint
speed = 0

def huaxian(amount):
    a1 = 0
    a2 = 1
    tem_he = 0
    shulie = []
    for i in range(1,amount+1):
        #end=''的效果是在一行显示输出的值
        #print(i,end='')
        tem_he = a1 +a2
        a1 = a2
        a2 = tem_he
        shulie.append(tem_he)
    #print(shulie)
    for i in range(1,amount):
#         for n in range(4):
#             forward(shulie[i])
#             left(90)
        circle(shulie[i],90)
#         write(shulie[i],font = ("微软雅黑",i+2))
amount = int(input('请输入你要体现的斐波那契数列的层数'))
huaxian(amount)
for i in range(amount):
    huaxian
    penup()
    home()
    jiaodu = 360/amount
    left(jiaodu * i)
    pendown()
    huaxian(amount)
mainloop()

16个斐波那契数列,220度渐变角度
20个数,260度旋转角度
12个数220度渐变

斐波数列又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、…… 在数学上,其以递推的方法定义为:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)。以下是几种使用 JavaScript 计算斐波数列的方法: ### 循环法 ```javascript function fibonacci(n) { var sequence = [0, 1]; if (n <= 2) { return sequence.slice(0, n); } for (var i = 2; i < n; i++) { var nextNumber = sequence[i - 1] + sequence[i - 2]; sequence.push(nextNumber); } return sequence; } ``` 此方法通过循环从第 2 项开始,依次计算每一项的值并添加到数组中,最终返回包含前 n 项的斐波数列数组,时间复杂度为 O(n),空间复杂度也为 O(n) [^2]。 ### 优化循环法 ```javascript var fib = function(n) { let pre = 0; let next = 1; if(n == 0) { return pre; } if(n == 1) { return next; } let cur = 0; for(let i = 2; i <= n; i++) { cur = pre + next; pre = next; next = cur; } return next; }; ``` 该方法仅使用三个变量来保存中间结果,避免了创建数组,最终返回第 n 项的值,时间复杂度为 O(n),空间复杂度为 O(1) [^3]。 ### 普通递归法 ```javascript function fibonacci(n) { if(n == 0) { return 0; } else if(n == 1) { return 1; } return fibonacci(n - 1) + fibonacci(n - 2); } ``` 递归方法根据斐波数列的定义,通过不断调用自身来计算第 n 项的值,但会存在大量的重复计算,时间复杂度为 O(2^n),空间复杂度为 O(n) [^3]。 ### Binet 方程法 ```javascript function fibonacciBinet(n) { const phi = 1.6180339887; return Math.round((Math.pow(phi, n) - Math.pow(1 - phi, n)) / Math.sqrt(5)); } ``` Binet 方程是一个用于计算斐波数列中任意一个数的公式,时间复杂度与空间复杂度均是 O(1),算是求斐波数列性能最好的一种方式,但由于浮点数运算的精度问题,对于较大的 n 可能会有误差 [^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值