斐波那契数列

一、定义与性质

数学定义: F(n) = F(n-1) + F(n-2),其中n ≥ 3

                              从第 3 项开始,每一项都等于前两项之和

为啥向日葵,这样排列生长,因为这样她能长出的种子,堆积得最多。

2倍速观看会好点。icon-default.png?t=N7T8https://www.douyin.com/search/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97%E6%B7%B1%E5%BA%A6%E8%AE%B2%E8%A7%A3?modal_id=7269972116097879351

我现在就去埃及、叙利亚、希腊、西西里和普罗旺斯研究数学,还赶不赶时髦?

哈哈哈,刚想崇拜一下,就转眼看到个有趣的评论:

还有更炸裂的:

哈哈哈哈哈,兔子也是中国的!!

该说不说,我这吃瓜群众,看得有点起劲儿~~~

回到正题

二、python与兔子数列【斐波那契数列】

# 手写斐波那契数列生成器
def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)

# 生成并打印前20项斐波那契数列
for i in range(20):
    print(f"F({i}) = {fibonacci(i)}")

参考代码链接:探索斐波那契数列:初学者教程_慕课手记 (imooc.com)

【1】递归

# 递归实现斐波那契数列
def fibonacci_recursive(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci_recursive(n-1) + fibonacci_recursive(n-2)

# 计算第20项
print(f"递归方法计算F(20) = {fibonacci_recursive(20)}")

【2】动态

# 动态规划实现斐波那契数列
def fibonacci_dp(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    fibs = [0, 1] + [0] * (n - 1)
    for i in range(2, n + 1):
        fibs[i] = fibs[i-1] + fibs[i-2]
    return fibs[n]

# 计算第20项
print(f"动态规划方法计算F(20) = {fibonacci_dp(20)}")

【3】生成斐波那契数列的前n项,并打印输出

# 生成斐波那契数列的前n项
def generate_fibonacci(n):
    sequence = [0, 1]
    for _ in range(2, n):
        sequence.append(sequence[-1] + sequence[-2])
    return sequence[:n]

# 生成并打印前20项斐波那契数列
print(generate_fibonacci(20))

三、C语言 实现兔子数列

【1】递归:效率低、时间复杂度O(2^n)

#include<stdio.h>
 
// 斐波那契数列函数
int fibonacci(int n) {
    if(n == 0) {
        return 0;
    } else if(n == 1) {
        return 1;
    } else {
        return fibonacci(n-1) + fibonacci(n-2);
    }
}
 
int main() {
    int n;
    printf("请输入一个整数:");
    scanf("%d", &n);
    printf("斐波那契数列的第%d项为:%d\n", n, fibonacci(n));
    return 0;
}

【2】循环:效率比递归高,时间复杂度O(n)

#include<stdio.h>
 
// 斐波那契数列函数
int fibonacci(int n) {
    if(n <= 1) {
        return n;
    }
    int a = 0, b = 1;
    for(int i = 2; i <= n; i++) {
        int temp = a + b;
        a = b;
        b = temp;
    }
    return b;
}
 
int main() {
    int n;
    printf("请输入一个整数:");
    scanf("%d", &n);
    printf("斐波那契数列的第%d项为:%d\n", n, fibonacci(n));
    return 0;
}

【3】动态:

#include<stdio.h>
 
// 斐波那契数列函数
int fibonacci(int n) {
    int f[n+2];   // 1 extra to handle case, n = 0
    int i;
  
    // 0th and 1st number of the series are 0 and 1
    f[0] = 0;
    f[1] = 1;
  
    for (i = 2; i <= n; i++) {
        // Add the previous 2 numbers in the series and store it
        f[i] = f[i-1] + f[i-2];
    }
  
    return f[n];
}
 
int main () {
    int n;
    printf("请输入一个整数:");
    scanf("%d", &n);
    printf("斐波那契数列的第%d项为:%d\n", n, fibonacci(n));
    return 0;
}

【4】矩阵乘法:时间复杂度是O(logn)

#include<stdio.h>
 
void multiply(int F[2][2], int M[2][2]);
 
void power(int F[2][2], int n);
 
// 斐波那契数列函数
int fibonacci(int n) {
    int F[2][2] = {{1,1},{1,0}};
    if (n == 0)
        return 0;
    power(F, n - 1);
    return F[0][0];
}
 
void multiply(int F[2][2], int M[2][2]) {
    int x =  F[0][0]*M[0][0] + F[0][1]*M[1][0];
    int y =  F[0][0]*M[0][1] + F[0][1]*M[1][1];
    int z =  F[1][0]*M[0][0] + F[1][1]*M[1][0];
    int w =  F[1][0]*M[0][1] + F[1][1]*M[1][1];
  
    F[0][0] = x;
    F[0][1] = y;
    F[1][0] = z;
    F[1][1] = w;
}
 
void power(int F[2][2], int n) {
    int i;
    int M[2][2] = {{1,1},{1,0}};
  
    // n - 1 times multiply the matrix to {{1,0},{0,1}}
    for (i = 2; i <= n; i++)
        multiply(F, M);
}
 
int main () {
    int n;
    printf("请输入一个整数:");
    scanf("%d", &n);
    printf("斐波那契数列的第%d项为:%d\n", n, fibonacci(n));
    return 0;
}

【5】公式法:

#include<stdio.h>
#include<math.h>
 
// 斐波那契数列函数
int fibonacci(int n) {
    double phi = (1 + sqrt(5)) / 2;
    return round(pow(phi, n) / sqrt(5));
}
 
int main () {
    int n;
    printf("请输入一个整数:");
    scanf("%d", &n);
    printf("斐波那契数列的第%d项为:%d\n", n, fibonacci(n));
    return 0;
}

参考代码:

斐波那契数列的C语言多种实现方法(递归、循环、动态规划、矩阵乘法和公式法)_斐波那契数列c语言-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_46359684/article/details/134768719

C 语言实例 - 斐波那契数列 中文教程 - IT自习室 (itzixishi.com)icon-default.png?t=N7T8https://www.itzixishi.com/course/c/c-examples-fibonacci-series.html

C 语言实例 – 斐波那契数列 | 菜鸟教程 (runoob.com)icon-default.png?t=N7T8https://www.runoob.com/cprogramming/c-examples-fibonacci-series.html

四、Java 与兔子数列

参考学习:

fuzhengwei/java-algorithms: 📝 Java 数据结构和算法 | Algorithms and data structures implemented in Java with explanations and links to further readings (github.com)

五、兔子数列【斐波那契数列】应用领域

计算机科学【预测类】:

斐波那契数列可以用于解决一些实际的问题,如预测某些自然现象或者优化某些算法。其次,斐波那契数列也是许多算法的基础,如排序算法和搜索算法。

例如,在排序算法中,斐波那契数列可以用于优化插入排序的效率。传统的插入排序在处理大数据集时效率较低,而利用斐波那契数列的性质,可以将插入排序的时间复杂度从O(n^2)降低到O(n)

算法优化:

以利用斐波那契数列的性质来加密信息,使得只有知道特定算法的人才能解密并获取信息。

伪随机数生成、AVL二叉树、最大公约数、合并排序算法

金融市场分析

技术分析中预测市场趋势和价格波动

  • 26
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值