计算斐波那契数列的性能对比:Python,Java,Go

??本文采用递归办法来计算斐波那契数列中的第38项,用于对于三种计算机语言的计算性能,这三种语言为:Python,Java,Go。
??我们采用递归法来求解斐波那契数列的第n项f(n),其算法描述如下:

function fib(n)
    if n = 0 return 0
    if n = 1 return 1
    return fib(n ? 1) + fib(n ? 2)

对于公平起见,我们利用三种程序计算f(38),运行100遍,得到平均耗时,作为性能对比。

??Python程序如下:

# -*- coding: utf-8 -*-
# author: Jclian91
# place: Pudong Shanghai
# time: 16:15

import time

# recursive method
def rec_fib(n):
    if n <= 1:
        return n
    else:
         return rec_fib(n-1) + rec_fib(n-2)

time_cost = 0
for _ in range(100):
    # time cost of cursive method
    t1 = time.time()
    t = rec_fib(38)
    t2 = time.time()
    time_cost += (t2-t1)

print('结果:%s, 平均运行时间:%s'%(t, time_cost/100))

??Java程序如下:

import java.util.Date;

public class Main {

    // 主函数
    public static void main(String[] args) {
        double time_cost = 0;
        for (int i=0; i<100; i++) {
            Date start_time = new Date(); //开始时间
            int n = 38;
            rec_fib(n);
            Date end_time1 = new Date(); // 结束时间
            Long cost_time1 = end_time1.getTime() - start_time.getTime();  // 计算时间,返回毫秒数
            time_cost += cost_time1;
        }
        System.out.println(String.format("Average cost time is %.3fs.", time_cost*1.0/1000));
    }

    // 利用递归方法计算斐波那契数列的第n项
    public static int rec_fib(int n){
        if(n == 0)
            return 0;
        if(n ==1)
            return 1;
        else
            return rec_fib(n-1) + rec_fib(n-2);
    }

}

??Go语言如下:

// rec_fib
package main

import (
    "fmt"
    "time"
)

// 函数返回第n个斐波那契数
func rec_fib(num int) int {
    if num <= 1 {
        return num
    } else {
        return rec_fib(num-1) + rec_fib(num-2)
    }
}

func main() {
    var time_cost float64
    for i := 0; i < 100; i++ {
        t1 := time.Now()
        n := 38
        rec_fib(n)
        t2 := time.Now()
        time_cost += t2.Sub(t1).Seconds()
    }
    fmt.Printf("Average cost time: %f.\n", time_cost/100)
}

??在同一台电脑上运行,得到的结果如下:

平均耗时(单位:秒) Python Java Go
/ 16.0151 0.1631 0.2398

可以看到,Java在该程序的性能表现最好,Go语言的效率比Python稍慢一些,但是是同一数量级,Python的运行时间大约是Go语言的66.7倍。

??本次分享到此结束,感谢大家的阅读~

原文地址:https://www.cnblogs.com/jclian91/p/12113154.html

时间: 2024-11-08 20:04:05

计算斐波那契数列的性能对比:Python,Java,Go的相关文章

用递归方法计算斐波那契数列(Recursion Fibonacci Python)

先科普一下什么叫斐波那契数列,以下内容摘自百度百科: 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因意大利数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,指的是这样一个数列:1.1.2.3.5.8.13.21.34...这个数列从第3项开始,每一项都等于前两项之和. 根据以上定义,用python定义一个函数,用于计算斐波那契数列中第n项的数字是多少: def fib_recur(n): if n==0 or n==1 : r

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

   斐波纳契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理.准晶体结构.化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1960年代起出版了<斐波纳契数列>季刊,专门刊载这方面的研究成果. [Fibonacci.cpp] #include<iostream>#

使用递归,计算斐波那契数列

使用递归,计算斐波那契数列 function fib(num) { if (num > 2) { return fib(num - 2) + fib(num - 1); } else { return 1; } } fib(6) 运行过程 1. return fib(4)+fib(5) 2.return fib(2)+fib(3)+fib(3)+fib(4) 3.return 1+fib(1)+fib(2)+fib(1)+fib(2)+fib(2)+fib(3) 4.return 1+1+1+1

以计算斐波那契数列为例说说动态规划算法(Dynamic Programming Algorithm Overlapping subproblems Optimal substructure Memoization Tabulation)

动态规划(Dynamic Programming)是求解决策过程(decision process)最优化的数学方法.它的名字和动态没有关系,是Richard Bellman为了唬人而取的. 动态规划主要用于解决包含重叠子问题的最优化问题,其基本策略是将原问题分解为相似的子问题,通过求解并保存重复子问题的解,然后逐步合并成为原问题的解.动态规划的关键是用记忆法储存重复问题的答案,避免重复求解,以空间换取时间. 用动态规划解决的经典问题有:最短路径(shortest path),0-1背包问题(K

斐波那契数列(C++ 和 Python 实现)

(说明:本博客中的题目.题目详细说明及参考代码均摘自 "何海涛<剑指Offer:名企面试官精讲典型编程题>2012年") 题目 1. 写一个函数,输入 n, 求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: 2. 一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级.求该青蛙跳上一个n级的台阶总共有多少种跳法? 3. 一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级,...... ,也可以跳上n级,此时该青蛙跳上一个 n 级的台阶共有多少种跳法

Python计算斐波那契数列

利用Python计算第一个达到一百万位数的斐波那契数列各位数之和 结果为4501552 以下是我用到的代码,不是中间需要一些人工操作来加快收敛性,有兴趣读者可以写代码加快收敛 首先执行这个,可以大致确定一百万个数所在斐波那契序列的位置 i=1 j=1 k=i+j count=3 while count<4850000: i=j j=k k=i+j count+=1 result=str(k) print('k长度') k_len=len(result) print(k_len) sum=0 fo

使用递归解决斐波那契数列的性能问题

我们知道斐波那契数列(也称作兔子数列)  1,1,2,3,5,8,13,21,34..... 前两位数固定是1,之后每一位数都是前两位数的之和,这样的数列就是斐波那契数列 那么我们要求这样的数列,就必须要求n-1和n-2位数 function getFB(n){ if(n == 1 || n == 2){ // 这里我们先保持前两位数是1 return 1; }else { return getFB(n-1) + getFB(n-2); } } console.log(getFB(10)); 求

利用数组计算斐波那契数列

本题要求编写程序,利用数组计算菲波那契(Fibonacci)数列的前N项,每行输出5个,题目保证计算结果在长整型范围内.Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列,例如::1,1,2,3,5,8,13,.... 输入格式: 输入在一行中给出一个整数N(1). 输出格式: 输出前N个Fibonacci数,每个数占11位,每行输出5个.如果最后一行输出的个数不到5个,也需要换行. 如果输入的N不在有效范围内,则输出"Invalid.". 输入样例1:

C# 4种方法计算斐波那契数列 Fibonacci

F1: 迭代法 最慢,复杂度最高 F2: 直接法 F3: 矩阵法 参考<算法之道(The Way of Algorithm)>第38页-魔鬼序列:斐波那契序列 F4: 通项公式法 由于公式中包含根号5,无法取得精确的结果,数字越大误差越大 1 using System; 2 using System.Diagnostics; 3 4 5 namespace Fibonacci 6 { 7 class Program 8 { 9 static void Main(string[] args) 1