fibonacci数列的性质和实现方法

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



原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/9445844.html

时间: 2024-11-06 07:32:52

fibonacci数列的性质和实现方法的相关文章

Fibonacci数列的性质

Fibonacci: 0, 1, 1, 2, 3, 5, 8, 13, .... F[0] = 0; 1: gcd(Fn, Fm) = F[gcd(n, m)]; 当n - m = 1 或 2时满足,可用数学归纳法证明: 2: 特征方程为 x^2 = x + 1, 类Fibonacci数列的特征方程为:ax^2 = bx + c; aF[n] = bF[n - 1] + cF[n - 2]; 3: (证明方法为补项和数学归纳法) f[0] + f[1] + ... + f[n] = f[n +

算法竞赛中常见的数学(一):Fibonacci数列

最近做的题目有很多都是与Fabonacci数列有关的,身为信息组蒟蒻的我最近经常与数学组李中一大神(Orz)畅谈,其中包括Fabonacci数列的若干性质,此处做一个总结. 参考资料: <组合数学(第5版)>.<具体数学(第2版)> 正文: Fibonacci数列是形如0.1.1.2.3.5.8.13.21.34……的数列.递归形式定义为: 数列F[n]=F[n-1]+F[n-2],其中F[0]=0,F[1]=1. 当然也有这样的类Fibonacci数列,即形如: G[n]=G[n

【编程题目】题目:定义 Fibonacci 数列 输入 n,用最快的方法求该数列的第 n 项。

第 19 题(数组.递归):题目:定义 Fibonacci 数列如下:/ 0 n=0f(n)= 1 n=1/ f(n-1)+f(n-2) n=2输入 n,用最快的方法求该数列的第 n 项. 思路:递归和非递归的 下面的代码有个问题,没有考虑大数越界.返回值应该设成long long型的 递归速度非常慢 /* 第 19 题(数组.递归): 题目:定义 Fibonacci 数列如下: / 0 n=0 f(n)= 1 n=1 / f(n-1)+f(n-2) n=2 输入 n,用最快的方法求该数列的第

Fibonacci数列性质的组合证明

数列 1, 1, 2, 3, 5, 8, 13, 21, 34, … 叫做 Fibonacci 数列.这个数列有很多神奇的性质,其中一个性质是,每一个 Fibonacci 数的平方与它前后两个 Fibonacci 数的乘积相比一定正好相差 1 .具体地说,如果把第 n 个 Fibonacci 数记做 Fn ,那么有: Fn+1 · Fn+1 - Fn · Fn+2 = (-1)n Fibonacci 数有很多组合数学上的意义.比如说,用 1 × 1 和 1 × 2 的积木覆盖一个 1 × n 的

求Fibonacci数列的第n项

题目: 定义Fibonacci数列如下: 方法一: 递归的方法,代码如下: #include<iostream> using namespace std; int Fibona(int n) { int m; if (n == 0) return 0; else if (n == 1 || n == 2) return 1; else { m = Fibona(n - 1) + Fibona(n - 2); return m; } } int main() { cout << &q

fibonacci数列为什么那么重要,所有关于数学的书几乎都会提到?【转自知乎】

转自知乎王希的回答.原文链接:http://www.zhihu.com/question/28062458/answer/39763094 一句话先回答问题:因为斐波那契数列在数学和生活以及自然界中都非常有用. 下面我就尽我所能,讲述一下斐波那契数列. 一.起源和定义 斐波那契数列最早被提出是印度数学家Gopala,他在研究箱子包装物件长度恰好为1和2时的方法数时首先描述了这个数列.也就是这个问题: 有n个台阶,你每次只能跨一阶或两阶,上楼有几种方法? 而最早研究这个数列的当然就是斐波那契(Le

Fibonacci数列

问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n. 输出格式 输出一行,包含一个整数,表示Fn除以10007的余数. 说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单. 样例输入 10 样例输出 55 样例输

为什么Fibonacci数列相邻两项之比会趋于0.618

转帖: http://www.matrix67.com/blog/archives/5221 你或许熟知一个非常经典的结论: Fibonacci 数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, … (头两项都是 1 ,此后每一项都是前两项之和)的相邻两项之比将会越来越接近黄金比例 0.618 ,不信请看: 1 / 1 = 1.0000000... 1 / 2 = 0.50000000... 2 / 3 = 0.66666667... 3 / 5 = 0.60000000

数据结构(1)—fibonacci数列的复杂度

开始第二遍复习数据结构,决定把一些有意思的题目做个简单的小结,第一个遇见的是这个经典的Fibonacci数列,题目要求是求这个数列的时间复杂度,对于这个数列,我也不作过多的介绍,下面是对数列的几种简单的实现 1.初始版 long fibonacci1(int n){ if(n==0) return 0; if(n==1) return 1; if(n>1){ return fibonacci1(n-1)+fibonacci1(n-2); } }//递归 这种写法是每一个初学者第一次接触到递归时都