斐波那契数列(各种代码实现斐波那契数列)

目录

1. 定义

 2. 与黄金分割的关系

3. C#代码实现 

4. Java代码实现 

5. JavaScript代码实现

6. C++代码实现

基本循环算法 

数组算法实现

递归算法实现

递归算法优化(记忆化搜索)

高精度计算

7. Python3代码实现

8. php代码实现

9. Rust代码实现


 

斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(≥ 2,∈ N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

1. 定义

斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89...

自然中的斐波那契数列

这个数列从第3项开始,每一项都等于前两项之和。

斐波那契数列的定义者,是意大利数学家莱昂纳多·斐波那契(Leonardo Fibonacci),生于公元1170年,卒于1250年,籍贯是比萨。他被人称作“比萨的莱昂纳多”。1202年,他撰写了《算盘全书》(Liber Abacci)一书。他是第一个研究了印度和阿拉伯数学理论的欧洲人。他的父亲被比萨的一家商业团体聘任为外交领事,派驻地点于阿尔及利亚地区,莱昂纳多因此得以在一个阿拉伯老师的指导下研究数学。他还曾在埃及、叙利亚、希腊、西西里普罗旺斯等地研究数学。另外斐波纳契还在计算机C语言程序题中应用广泛

 2. 与黄金分割的关系

这样一个完全是自然数的数列,通项公式却是用无理数来表达的。而且当n趋向于无穷大时,前一项与后一项的比值越来越逼近黄金分割0.618(或者说后一项与前一项的比值小数部分越来越逼近 0.618)。

 

3. C#代码实现 

public static int GetiNum(int n) {
	long preVal = 1;
    long prePreVal = 0;
    if (n < 2)
        return n;
    long loop = 1;
    long returnVal = 0;
    while (loop < n) {
        returnVal = preVal + prePreVal;
        prePreVal = preVal;
        preVal = returnVal;
        loop++;
    }
    return returnVal;
}

4. Java代码实现 

//①==================================
/**
* 平推方法实现
*/
public static long fibLoop(int num) {
    if(num < 1 || num > 92)
        return 0;
    long a = 1;
    long b = 1;
    long temp;
    for(int i = 2; i < num; i++) {
        temp = a;
        a = b;
        b += temp;
    }
    return b;
}

//②==================================
/**
* 递归方法实现
* f(n) = f(n - 1) + f(n - 2)
* 最高支持 n = 92 ,否则超出 Long.MAX_VALUE
* @param num n 
* @return f(n) 
*/
public static long fibRec(int num) {
    if(num < 1)
        return 0;
    if(num < 3)
        return 1;
    return fibRec(num - 1) + fibRec(num - 2);
}

//③==================================
static long[] l = new long[93];
static {
    l[1] = 1;
}
/**
* 带有缓存的方法,比fibRec方法性能好很多
*/
public static long fibBuffRec(int num) {
    if(num < 1 || num > 92)
        return 0;
    if(l[num] == 0)
        l[num] = fibBuffRec(num - 1) + fibBuffRec(num - 2);
    return l[num];
}

//④==================================
static List<BigDecimal> list = new ArrayList<BigDecimal>(93);
static {
    list.add(BigDecimal.ZERO);
    list.add(BigDecimal.ONE);
}
/**
* 1,2,3,4,5,6, 7 ,8 
* 1,1,2,3,5,8,13,21
* 支持num超过92的超大型数字,使用了ArrayList进行缓存以提高性能
*/
public static BigDecimal fibBig(int num) {
    if(num < 0)
        return list.get(0);
    if (list.size() <= num)
        list.add(fibBig(num - 1).add(fibBig(num - 2)));
    return list.get(num);
}

5. JavaScript代码实现

//循环算法
function f(n){
  if(n == 0){
    return 0;
  }else if(n ==1){
  return 1;
  }else{
    var fn1 = 0;
    var fn2 = 1;
    var fnx = 0;
    for(var i=0;i<n-1; i++){
      var newfn1 = fn2;
      fnx = fn1 + fn2;
      fn1 = fn2;
      fn2 = fnx;
  }
    return fnx;
  }
}
//===============================
//递归算法
function fib(count) {
//参数判断
    var count = parseInt(count);
     if (isNaN(count) || count <= 0) {
         return 0;
    }
    function f(count) {
        if (count <= 2) {
            return 1;
         }
         return f(count - 1) + f(count - 2);
     }
        return f(count);
}

6. C++代码实现

基本循环算法 

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a=0,b=0,c=1,n;
    cin>>n;//输入n
    for(int i=1;i<=n-1;i++)
    {
        a=b;
        b=c;
        c=a+b;
    }
    cout<<c;//输出最终结果
    return 0;
}

数组算法实现

#include<iostream>
using namespace std;
int main()
{
    int a[30],i,n;
    cin>>n;
    a[1]=a[0]=1;
    for(i=2;i<n;i++)
    {
        a[i]=a[i-2]+a[i-1];
    }
    cout<<a[n-1];
    return 0;
}

递归算法实现

#include<iostream>
using namespace std;
int f(int n)
{
    return (n<3)? 1 : f(n-1)+f(n-2);//如果是前两项,则输出1
}
int main()
{
    int n;
    cin>>n;
    cout<<f(n);
    return 0;
}

递归算法优化(记忆化搜索)

# include <bits/stdc++.h>
const int MAX=101;
using namespace std;
int a[MAX];
int f(int n)
{
    if(a[n]!=-1) return a[n];
    else
{
        a[n]=f(n-1)+f(n-2);
        return a[n];
    }
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<=MAX-1;i++)
    {//初始化 
        a[i]=-1;
    }
    a[0]=0;a[1]=1;
    cout<<f(n);
    return 0;
}

高精度计算

#include <bits/stdc++.h>
using namespace std;
char sum[1200];
int s=0,m=0,n;
int main()
{
    cin>>n;
    string s1,s2;
    int a[1200],b[1200];
    int he,i;
    s1="0";
    s2="1";
    for(m=2;m<n+1;m++)
    {
        memset(a,0,sizeof a);
        memset(b,0,sizeof b);
        a[0]=s1.length();
        for(i=1;i<=a[0];i++)
        {
            a[i]=s1[a[0]-i]-'0';
        }
        b[0]=s2.length();
        for(i=1;i<=b[0];i++)
        {
            b[i]=s2[b[0]-i]-'0';
        }
        he=(a[0]>b[0]?a[0]:b[0]);
        for(i=1;i<=he;i++)
        {
            a[i]+=b[i];
            a[i+1]+=a[i]/10;
            a[i]%=10;
        }
        he++;
        while((a[he]==0)&&(he>1))
        he--;
            for(i=he,s=0;i>=1;i--,s++)
            {
                sum[s]=a[i]+'0';
            }
        s1=s2;
        s2=sum;
    }
    cout<<s2<<endl;
    return 0;
}

7. Python3代码实现

#输出在3000以内的斐波那契数列

一、从最大值考虑

numMax = int(input('please input  a maxnumber : '))


def flibsOne(numMax):    
    
    c = []    
    
    a, b = 0, 1    
    
    while a < numMax: 
        
        a, b = b, a + b        
        
        c.append(a)    
    
    c.remove(c[-1])    
    
    print(c)

二、从位数考虑

num = int(input('please input  a number : '))

def flibsTwo(num):    
    
    list1 = []    
    
    for i in range(num):        
            if i <=1:
                list1.append(1)
            else:    
                list1.append(list1[-2] + list1[-1])
    return list1    

print(flibsTwo(num)) #输出num位数列

第三种,根据f(n)= f(n-1)+f(n-2)实现
Fbs = [1,1]#斐波那契数列前两位
n = 3
s = input("Maxmun ")#输入最大次数
while n != (int(s)+1) :#因为差一原则所以要再加一
    a = Fbs[-1]
    b = Fbs[-2]
    fb = a+b
    print(str(n)+" "+str(fb))
    n = n +1
    Fbs.append(fb)

8. php代码实现

// 动态规划解斐波那契数列
function fibRec(int $n)
{
	if ($n == 0) {
		return $n;
	}
	
	$a1 = 0;
	$a2 = 1;

	for ($i = 1; $i < $n; $i++) {
    	[$a1, $a2] = [$a2, $a1 + $a2];        
    }
    
    return $a2;
}

9. Rust代码实现

// Rust代码实现

fn main() {
  println!("{} {} {} {} {}", fib(0), fib(1), fib(2), fib(3), fib(4));
}

fn fib(d: i32) -> i32 {
  if d == 0 || d == 1 {
    d
  } else {
    ficc(d - 2) + ficc(d - 1)
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力学习前端的小陈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值