一、定义与性质
数学定义: F(n) = F(n-1) + F(n-2),其中n ≥ 3
从第 3 项开始,每一项都等于前两项之和
为啥向日葵,这样排列生长,因为这样她能长出的种子,堆积得最多。
我现在就去埃及、叙利亚、希腊、西西里和普罗旺斯研究数学,还赶不赶时髦?
哈哈哈,刚想崇拜一下,就转眼看到个有趣的评论:
还有更炸裂的:
哈哈哈哈哈,兔子也是中国的!!
该说不说,我这吃瓜群众,看得有点起劲儿~~~
回到正题
二、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 语言实例 - 斐波那契数列 中文教程 - IT自习室 (itzixishi.com)
https://www.itzixishi.com/course/c/c-examples-fibonacci-series.html
四、Java 与兔子数列
参考学习:
五、兔子数列【斐波那契数列】应用领域
计算机科学【预测类】:
斐波那契数列可以用于解决一些实际的问题,如预测某些自然现象或者优化某些算法。其次,斐波那契数列也是许多算法的基础,如排序算法和搜索算法。
例如,在排序算法中,斐波那契数列可以用于优化插入排序的效率。传统的插入排序在处理大数据集时效率较低,而利用斐波那契数列的性质,可以将插入排序的时间复杂度从O(n^2)降低到O(n)
算法优化:
以利用斐波那契数列的性质来加密信息,使得只有知道特定算法的人才能解密并获取信息。
伪随机数生成、AVL二叉树、最大公约数、合并排序算法
金融市场分析
技术分析中预测市场趋势和价格波动