本文采用遞歸辦法來計算斐波那契數列中的第38項,用於對於三種計算機語言的計算性能,這三種語言爲:Python,Java,Go。
咱們採用遞歸法來求解斐波那契數列的第n項f(n),其算法描述以下:java
function fib(n) if n = 0 return 0 if n = 1 return 1 return fib(n − 1) + fib(n − 2)
對於公平起見,咱們利用三種程序計算f(38),運行100遍,獲得平均耗時,做爲性能對比。python
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) }
在同一臺電腦上運行,獲得的結果以下:code
平均耗時(單位:秒) | Python | Java | Go |
---|---|---|---|
/ | 16.0151 | 0.1631 | 0.2398 |
能夠看到,Java在該程序的性能表現最好,Go語言的效率比Python稍慢一些,可是是同一數量級,Python的運行時間大約是Go語言的66.7倍。orm
本次分享到此結束,感謝你們的閱讀~遞歸