題目
輸入一個>0的整數,輸出該位置的斐波那契數
斐波那契數參考:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368…
思路
斐波那契數爲前兩個固定,之後的遵循f(n)=f(n-1)+f(n-2)
遞歸方法:直接將算法遞歸,出口是n=1或者n=2
迭代方法:從第三個數算起,一直通過f(n)=f(n-1)+f(n-2)的方式直接計算到n
比較:迭代更快,因爲遞歸需要往返
代碼
package main
import (
"fmt"
)
//遞歸方法
func printFbnR(n int) int {
if n == 1 || n == 2 {
return 1
}else {
return printFbn(n - 1) + printFbn(n - 2)
}
}
//迭代方法,從第三個數開始計算,一直計算到n
func printFbn(n int) int {
if n == 1 || n == 2 {
return 1
}else {
var curr int
//定義第1,2個數。它們是固定的
n1, n2 := 1, 1
for i := 3; i <= n; i++ {
//通過前兩個數,計算第3個數一直到。。。n
curr = n1 + n2
//交換
n1, n2 = n2, curr
}
return curr
}
}
func main() {
var n int
for {
fmt.Printf("請輸入一個大於0的整數: ")
fmt.Scanln(&n)
if n < 1 {
fmt.Println("輸入錯誤!")
continue
}
fmt.Printf("遞歸:%v的斐波那契數爲: %v\n\n", n, printFbnR(n))
fmt.Printf("迭代:%v的斐波那契數爲: %v\n\n", n, printFbn(n))
}
}