费波那其数列

 费波那其数列,1,1,2,3,5……编写程序求第n项。

 
#include <iostream>
using namespace std;

unsigned phe( int n );
unsigned main(void)
......{
    cout << phe(50 << endl;
    return 0;
}
//方法1:
unsigned phe( int n )
......{
    unsigned *a;
    a = new unsigned[ n + 1 ];
    a[1] = 1;
    a[2] = 1;
    for( int i = 3; i < n + 1; i++ )
        a [i] = a[i - 1] + a[i -2 ];
    unsigned int temp = a[n];
    delete a;
    return temp;
}//此种方法利用了简单的数组存放.
//方法2:
unsigned phe( int n )
......{
    if (n == 1 || n == 2)
        return 1;
    return(  phe(n - 2) + phe(n - 1) );
}//此种方法虽然看起来简单,但是却应为同时又两个取递归,导致堆栈的崩溃.长时间看不到结果 .

//方法3:
unsigned phe( int n )
......{
    int a,b ,result;
    a = b = 1;result = 2;
    for( int i = 4; i < n + 1; i++ )
    ......{
        a = b;
        b = result;
        result = a + b;
    }
    return result;
}//此种方法是方法1的改进.不用保存以前的数据.
在C语言中,有多种方式可以实现斐波那契数列,以下是一些常见的实现方法: ### 通项公式法 斐波那契数列的通项公式(Binet公式)可以直接计算第n项,但可能会出现精度问题。以下是使用该公式实现的代码: ```c #include <stdio.h> #include <math.h> // 通项公式计算斐波那契数列的第n项 int fibonacci(int n) { double phi = (1 + sqrt(5)) / 2; // 黄金分割比 double psi = (1 - sqrt(5)) / 2; // 黄金分割比的共轭 return (int)round((pow(phi, n) - pow(psi, n)) / sqrt(5)); } int main() { int n; printf("Enter the term number: "); scanf("%d", &n); printf("The %dth term of the Fibonacci sequence is: %d\n", n, fibonacci(n)); return 0; } ``` 这种方法的优点是时间复杂度为$O(1)$,但由于使用了浮点数运算,可能会出现精度问题[^1]。 ### 优化空间复杂度的动态规划实现 通过只存储前两个斐波那契数,可以进一步优化空间复杂度。以下是实现代码: ```c #include <stdio.h> int fibonacci(int n) { if (n <= 1) { return n; } int prev2 = 0, prev1 = 1, current; for (int i = 2; i <= n; i++) { current = prev1 + prev2; prev2 = prev1; prev1 = current; } return current; } int main() { int n = 10; // 计算第10个斐波那契数 printf("Fibonacci(%d) = %d\n", n, fibonacci(n)); return 0; } ``` 该方法的时间复杂度为$O(n)$,空间复杂度为$O(1)$[^2]。 ### 计算斐波那契数列前20项 以下代码可以计算并输出斐波那契数列的前20项: ```c #include<stdio.h> #include<math.h> #include<stdlib.h> #include<string.h> #include<ctype.h> // 函数声明 void fun(); // 主函数 int main() { // 调用函数 fun(); // 返回 return 0; } // 子函数 void fun() { // 定义数组 int a[20]; // 初始化前两项为1 a[0]=a[1]=1; // 从第三项开始计算 for(int i=2;i<20;i++) { // 进行计算 a[i]=a[i-1]+a[i-2]; } // 遍历数组 for(int i=0;i<20;i++) { // 输出结果 printf("数列第%d项是:%d\n",i+1,a[i]); } } ``` 此代码使用数组存储斐波那契数列的前20项,时间复杂度为$O(n)$,空间复杂度为$O(n)$[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值