神奇的斐波那契数列

完美的黄金分割化身,彰显自然之美!

1、斐波那契数列又叫黄金分割数列,他以著名的数学家斐波那契的名字命名,以此纪念他的杰出贡献。斐波那契以兔子繁殖为例子,他发现了这样一个规律:前两项之和等于第三项。

        一个有趣的发现:小学数学课本、乃至初中、高中课本都会引入讲解兔子繁殖的问题,甚至幼儿读本和大学课本都会讲到兔子繁殖的问题。

斐波那契数列的神奇之处:黄金分割

黄金分割:所谓的黄金分割就是将某一个整体随机的一分为二,人们发现较大的部分和整体的比值等于较小的部分与较大部分的比值,经过无数次的计算,人们发现其比值等于0.618。

举个例子:有一个苹果,随机的切成两半,小的一半称为A,大的一半称为B,按照上述,A/B=B/A+B约等于0.618。而人们发现越是接近0.618的物体,越容易引起美感。换句话说,越是漂亮的东西其整体和部分的比值越接近0.618,因此人们称之为黄金分割。

        斐波那契数列的表现就是一个完美的黄金分割现象。因为不仅仅是兔子繁殖遵循斐波那契数列,自然界中有许多现象体现了斐波那契数列。比如树木枝丫的生长。

 真的太神奇了!万物的生长似乎在遵循着某种规律,而我们的科学家似乎发现了这一规律。除此之外还有很多很多生物也在遵循斐波那契数列的规律。比如玫瑰、百合花、梅花、向日葵等,是巧合吗?令人难以置信而又十分的好奇,以至于我写下来这篇带着感情的文章。~哈哈哈。

想详细了解的可以去网上搜索斐波那契数列的来源,科学之美不谈了,直接切入主题,我罗列了几种关于斐波那契数列的c/c++的程序,我认为这些程序简单而又富有真理。值得新手学习~

我简单的画了一个枝丫生长的草图:

 简单粗暴的定义规则:不考虑其他任何条件,假设枝丫一年长一个,某枝丫第一年长一个新枝丫后,第二年就不长了,也就是休息一年积蓄营养等待第三年再长,(自然界中的很多植物就是这么长的,只不过时间不一),具体的我写在图片了。

斐波那契数列的C语言实现:

#include<stdio.h>

int main()
{
    int a=0,b=0,c=1,n;
    printf("请输入年份:");
    scanf("%d",&n);
    for(int i=1;i<=n-1;i++)
    {
        a=b;
        b=c;
        c=a+b;
    }
   printf("输出结果为:%d\n",c);//输出最终结果
    return 0;
}

斐波那契数列的C语言递归算法实现:

#include<stdio.h>
int func(int n)
{
    if(n<2)
    return 1;
    return func(n-1)+func(n-2);
}
int main(int argc, char const *argv[])
{
    int i,n=0;
    here:
    printf("请输入一个非负正整数:");
    scanf("%d",&n);
    if(n<=0)
    {
        printf("输入的%d不是一个非负正整数,请重新输入!\n",n);
        goto here;
    }

    for(i=0;i<n;i++)
    {
        printf("%d ",func(i));
    }
    printf("\n");

    return 0;
}

斐波那契数列的C++基本循环算法实现:

#include<bits/stdc++.h>

using namespace std;

int main()
{
    int a=0,b=0,c=1,n;
    cout<<"请输入年份:";
    cin>>n;//输入n
    for(int i=1;i<=n-1;i++)
    {
        a=b;
        b=c;
        c=a+b;
    }
    cout<<"输出结果为:"<<c;//输出最终结果
    return 0;
}

斐波那契数列的C++数组算法实现:

#include<iostream>
using namespace std;
int main()
{
    int a[30],i,n;
    cout<<"请输入年份:";
    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;
}

斐波那契数列的C++递归算法实现:

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

斐波那契数列的C++递归算法优化后的实现:

# 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;
    cout<<"请输入年份:";
    cin>>n;
    for(int i=0;i<=MAX-1;i++)
    {//初始化
        a[i]=-1;
    }
    a[0]=0;a[1]=1;
    cout<<"输出结果为:"<<f(n);
    return 0;
}

斐波那契数列的C++递归算法基于记忆化搜索的高精度实现:

#include <bits/stdc++.h>
using namespace std;
char sum[1200];
int s=0,m=0,n;
int main()
{
    cout<<"请输入年份:";
    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;
}

了解斐波那契数列的由来和规律,再分析规律和用编程语言去实现,这将是加深对斐波那契数列的理解,也是对自然生长规律的探索,更是对编程的理解,编程的最终目的是为了解决现实世界中的问题,说人话:为人类谋福祉。哈哈哈~

以上都是建立在自学的基础上总结出来的,目的加深理解和学习编程之用。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值