[算法]计算斐波拉契数列

简介: [算法]计算斐波拉契数列

简单的递归方法

使用递归计算斐波拉契数列,写起来简单。

由于没保存中间结果,所以每一步都要重复计算,超过40就会变慢。

func Fib1(n uint) uint {
  // version1, 计算斐波拉契数列
  // 使用递归。超过40后,由于重复计算就会很慢
  if n == 1 || n == 2 {
    return 1
  }
  return (Fib1(n-2) + Fib1(n-1))
}

使用数组保存中间结果

使用数组保存中间结果,避免了重复计算。

func Fib2(n uint) uint {
  // version2, 计算斐波拉契数列
  // 时间复杂度O(N),空间复杂度O(1)
  if n == 1 || n == 2 {
    return 1
  }
  // 将中间结果保存在数组中,避免重复计算
  var fibarr = [3]uint{0,1,0}
  var j uint = 2
  for ; j <= n; j++ {
    fibarr[2] = fibarr[0] + fibarr[1]
    fibarr[0] = fibarr[1]
    fibarr[1] = fibarr[2]
  }
  return fibarr[2]
}

完整示例代码

go实现

package main
import (
  "fmt"
  "time"
)
func Fib1(n uint) uint {
  // version1, 计算斐波拉契数列
  // 使用递归。超过40后,由于重复计算就会很慢
  if n == 1 || n == 2 {
    return 1
  }
  return (Fib1(n-2) + Fib1(n-1))
}
func Fib2(n uint) uint {
  // version2, 计算斐波拉契数列
  // 时间复杂度O(N),空间复杂度O(1)
  if n == 1 || n == 2 {
    return 1
  }
  // 将中间结果保存在数组中,避免重复计算
  var fibarr = [3]uint{0,1,0}
  var j uint = 2
  for ; j <= n; j++ {
    fibarr[2] = fibarr[0] + fibarr[1]
    fibarr[0] = fibarr[1]
    fibarr[1] = fibarr[2]
  }
  return fibarr[2]
}
func main() {
  startTime := time.Now()
  var i uint = 1
  for ; i < 10; i++ {
    fmt.Printf("%d, %d\n",i,Fib2(i))
  }
  endTime := time.Since(startTime)
  fmt.Println("计算用时",endTime)
}

python实现

from time import time
def fib1(number: int) -> int:
    if number == 1 or number ==2:
        return 1
    return fib1(number-2) + fib1(number-1)
def fib2(number: int) -> int:
    if number == 1 or number ==2:
        return 1
    
    fibarr = [0,1,0]
    j = 2
    while j <= number:
        fibarr[2] = fibarr[0] + fibarr[1]
        fibarr[0] = fibarr[1]
        fibarr[1] = fibarr[2]
        j += 1
    return fibarr[2]
if __name__ == '__main__':
    start_time = time()
    print(fib1(40))
    end_time = time()
    print(f"fib1 耗时 {(end_time - start_time):.4f} seconds")
    start_time2 = time()
    print(fib2(40))
    end_time2 = time()
    print(f"fib2 耗时 {(end_time2 - start_time2):.4f} seconds")
相关文章
|
6月前
|
算法 机器人
基于SOA海鸥优化算法的PID控制器最优控制参数计算matlab仿真
本课题研究基于海鸥优化算法(SOA)优化PID控制器参数的方法,通过MATLAB仿真对比传统PID控制效果。利用SOA算法优化PID的kp、ki、kd参数,以积分绝对误差(IAE)为适应度函数,提升系统响应速度与稳定性。仿真结果表明,SOA优化的PID控制器在阶跃响应和误差控制方面均优于传统方法,具有更快的收敛速度和更强的全局寻优能力,适用于复杂系统的参数整定。
|
10月前
|
算法 JavaScript 数据安全/隐私保护
基于GA遗传优化的最优阈值计算认知异构网络(CHN)能量检测算法matlab仿真
本内容介绍了一种基于GA遗传优化的阈值计算方法在认知异构网络(CHN)中的应用。通过Matlab2022a实现算法,完整代码含中文注释与操作视频。能量检测算法用于感知主用户信号,其性能依赖检测阈值。传统固定阈值方法易受噪声影响,而GA算法通过模拟生物进化,在复杂环境中自动优化阈值,提高频谱感知准确性,增强CHN的通信效率与资源利用率。预览效果无水印,核心程序部分展示,适合研究频谱感知与优化算法的学者参考。
|
存储 分布式计算 算法
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
326 0
|
算法 数据安全/隐私保护
基于Big-Bang-Big-Crunch(BBBC)算法的目标函数最小值计算matlab仿真
该程序基于Big-Bang-Big-Crunch (BBBC)算法,在MATLAB2022A中实现目标函数最小值的计算与仿真。通过模拟宇宙大爆炸和大收缩过程,算法在解空间中搜索最优解。程序初始化随机解集,经过扩张和收缩阶段逐步逼近全局最优解,并记录每次迭代的最佳适应度。最终输出最佳解及其对应的目标函数最小值,并绘制收敛曲线展示优化过程。 核心代码实现了主循环、粒子位置更新、适应度评估及最优解更新等功能。程序运行后无水印,提供清晰的结果展示。
279 14
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
381 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
算法 数据可视化 数据安全/隐私保护
基于LK光流提取算法的图像序列晃动程度计算matlab仿真
该算法基于Lucas-Kanade光流方法,用于计算图像序列的晃动程度。通过计算相邻帧间的光流场并定义晃动程度指标(如RMS),可量化图像晃动。此版本适用于Matlab 2022a,提供详细中文注释与操作视频。完整代码无水印。
|
算法 C++
如何精确计算出一个算法的CPU运行时间?
如何精确计算出一个算法的CPU运行时间?
|
机器学习/深度学习 算法
**反向传播算法**在多层神经网络训练中至关重要,它包括**前向传播**、**计算损失**、**反向传播误差**和**权重更新**。
【6月更文挑战第28天】**反向传播算法**在多层神经网络训练中至关重要,它包括**前向传播**、**计算损失**、**反向传播误差**和**权重更新**。数据从输入层流经隐藏层到输出层,计算预测值。接着,比较预测与真实值计算损失。然后,从输出层开始,利用链式法则反向计算误差和梯度,更新权重以减小损失。此过程迭代进行,直到损失收敛或达到训练次数,优化模型性能。反向传播实现了自动微分,使模型能适应训练数据并泛化到新数据。
379 2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题