题目
输入一个>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))
}
}