1. 程式人生 > >fibonacci數列的性質和實現方法

fibonacci數列的性質和實現方法

blank 定義 net lse 閉包 n-2 const 分割 斐波那契

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

  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\n", 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\n", 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數列的性質和實現方法