这里推荐一篇实用的文章:《【Docker项目实战】使用Docker部署Notepad轻量级记事本》,作者:【江湖有缘】。
https://cloud.tencent.com/developer/article/2466037
是一篇 Docker 项目实战,演示部署一个轻量级记事本应用,实现了跨设备的临时文本存储与编辑功能,文章中的实践可以显著加深对 Docker 容器化技术的理解。这是一篇极具价值的经验文章,为更复杂的应用开发奠定坚实基础。
斐波那契数列可以用兔子数列来理解。 首先假设第一个月有一对初生兔子,第二个月进入成熟期,第三个月开始生育兔子,并兔子永不死去,它们按照下列的方式繁衍:
依此类推。 可以明显地看到:当月的兔子数=上个月兔子数+上上个月兔子数。
所以,不难看出,斐波那契数列是这样的:1,1,2,3,5,8,13,21,34,55,...
递归表达就是:
设计递归算法实现斐波那契数列。
int Fibonacci(int n)
{
if (n <= 0)
return 0;
if (n == 1 || n == 2)
return 1;
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
测试代码:
#include <stdio.h>
#include <stdlib.h>
int Fibonacci(int n)
{
if (n <= 0)
return 0;
if (n == 1 || n == 2)
return 1;
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
int main(int argc,char **argv)
{
int n = 6;
if (argc > 1)
n = atoi(argv[1]);
printf("n= %d, Fibonacci: %d\n", n, Fibonacci(n));
return 0;
}
执行结果:
$ ./Fibonacci
n= 6, Fibonacci: 8
$ ./Fibonacci 10
n= 10, Fibonacci: 55
用T(n)表示示Fibonacci(n)所需的基本操作次数,则: n=1时,T(n)=1。 n=2时,T(n)=1。 n=3时,T(n)=3;调用Fib1(2)和Fib1(1)并执行一次加法运算(Fib1(2)+Fib1(1))。
因此,n>2时,T(n)=T(n-1)+T(n-2)+1。它们的关系为:
斐波那契数列的通项公式:
这里可以看到,时间复杂度属于爆炸增量函数。
int Fibonacci_1(int n) {
int *F = new int[n + 1];//定义一个长度为n+1的数组,空间尚未使用
F[1] = 1;
F[2] = 1;
for (int i = 3; i <= n; i++)
F[i] = F[i - 1] + F[i - 2];
return F[n];
}
这时,时间复杂度O(n),空间复杂度O(n)。时间复杂度降下来了,算法效率有了重大突破,但是空间复杂度上去了。
上述算法优化使用了一个辅助数组记录中间结果,空间复杂度O(n);其实只需要第n个斐波那契数,中间结果只是为了下一次使用,不需要保存。所以,可以采用迭代法进行算法优化:
int Fibonacci_2(int n){
if(n==1||n==2)
return 1;
int f1=1;
int fs2=1;
for(int i=3;i<=n;i++){
int tmp=f1+f2;
f1=f2;
f2=tmp;
}
return f2;
}
使用三个辅助变量进行迭代,时间复杂度O(n),但是空间复杂度降为O(1)。
随着n趋向无穷大,斐波那契数列中前一项与后一项的比值越来越逼近黄金分割数0.618。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。