fibonacci数列的性质和实现方法
Posted alingmaomao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fibonacci数列的性质和实现方法相关的知识,希望对你有一定的参考价值。
1.gcd(fib(n),fib(m))=fib(gcd(n,m))
证明:可以通过反证法先证fibonacci数列的任意相邻两项一定互素,然后可证n>m时gcd(fib(n),fib(m))=gcd(fib(n-m),fib(m)),递归可
求gcd(fib(n),fib(m))=gcd(fib(k),fib(l)),最后k=l,不然继续递归。K是通过展转相减法求出,易证k=gcd(n,m),所以gcd(fib(n),fib(m))
=fib(gcd(n,m))。
2.如果fib(k)能被x整除,则fib(k*i)都可以被x整除。
3.f(0)+f(1)+f(2)+…+f(n)=f(n+2)-1
4.f(1)+f(3)+f(5)+…+f(2n-1)=f(2n)
5.f(2)+f(4)+f(6)+…+f(2n) =f(2n+1)-1
6.[f(0)]^2+[f(1)]^2+…+[f(n)]^2=f(n)·f(n+1)
7.f(0)-f(1)+f(2)-…+(-1)^n·f(n)=(-1)^n·[f(n+1)-f(n)]+1
8.f(m+n)=f(m-1)·f(n-1)+f(m)·f(n)
9.[f(n)]^2=(-1)^(n-1)+f(n-1)·f(n+1)
10.f(2n-1)=[f(n)]^2-[f(n-2)]^2
11.3f(n)=f(n+2)+f(n-2)
12.f(2n-2m-2)[f(2n)+f(2n+2)]=f(2m+2)+f(4n-2m) [ n〉m≥-1,且n≥1]c
3.菲波那契前n项和就是菲波那契第n+2项-1
-
go语言之斐波那契数列的几种实现方法
斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)
在学习go语言基础的过程中,学习了斐波那契数列的几种实现方法,总的可以分为递归和非递归实现。本文按照用到的方法侧重点不同,现细分如下:
- 递归实现
- 递归实现改进
- 数组递归实现
- 闭包实现
1 package main 2 3 import "fmt" 4 5 const LIM = 40 6 7 func main() { 8 //result := 0 9 //var array []int 10 var array [LIM]int 11 for i := 0; i < LIM; i++ { 12 array[i] = fibonacci(i) 13 //result = fibonacci(i) 14 //array = append(array, result) 15 //fmt.Printf("fibonacci(%d) is: %d ", i, result) 16 } 17 fmt.Println(array) 18 } 19 20 func fibonacci(n int) (res int) { 21 if n <= 1 { 22 res = 1 23 } else { 24 res = fibonacci(n-1) + fibonacci(n-2) 25 } 26 return 27 }
package main import "fmt" const LIM = 40 var fibs [LIM]uint64 func main() { //var result uint64 = 0 var array [LIM]uint64 for i := 0; i < LIM; i++ { array[i] = fibonacci(i) //result = fibonacci(i) //array = append(array, result) //fmt.Printf("fibonacci(%d) is: %d ", i, result) } fmt.Println(array) } func fibonacci(n int) (res uint64) { // memoization: check if fibonacci(n) is already known in array: if fibs[n] != 0 { res = fibs[n] return } if n <= 1 { res = 1 } else { res = fibonacci(n-1) + fibonacci(n-2) } fibs[n] = res return } 1
package main import "fmt" const LIM = 40 func main() { fmt.Println(fibarray(LIM)) } func fibarray(term int) []int { farr := make([]int, term) farr[0], farr[1] = 1, 1 for i:= 2; i < term; i++ { farr[i] = farr[i-1] + farr[i-2] } return farr }
闭包实现 package main import "fmt" const LIM = 40 func main() { f := fibonacci() //返回一个闭包函数 var array [LIM]int for i := 0; i < LIM; i++ { array[i] = f() } fmt.Println(array) } func fibonacci() func() int { back1, back2 := 0, 1 return func() int { // 重新赋值 back1, back2 = back2, (back1 + back2) return back1 } }
该文章节选自其它博客
https://blog.csdn.net/dangchuanbiao/article/details/71185009
https://blog.csdn.net/qq_15571091/article/details/48528041
巨佬的博客
https://www.cnblogs.com/Milkor/p/4734763.html
以上是关于fibonacci数列的性质和实现方法的主要内容,如果未能解决你的问题,请参考以下文章
python实现斐波那契数列(Fibonacci sequence)