如何使用 C++ 示例实现斐波那契数算法

举报
Tiamo_T 发表于 2021/09/29 14:16:43 2021/09/29
3.2k+ 0 0
【摘要】 Fibonacci 是一位意大利数学家,他将这门学科引入了欧洲数学,但在他那个时代之前就已经提到了类似的数组。Fibonacci 数有两种定义,略有变化。两者非常相似,但同时几乎没有什么不同。第一:0, 1, 1, 2, 3, 5, 8, ...第二:1, 1, 2, 3, 5, 8, ...如果仔细观察上面的序列,每个数字都被构造为前两个数字的总和。前两个数字是:零和一(或一和一)。对于本...

Fibonacci 是一位意大利数学家,他将这门学科引入了欧洲数学,但在他那个时代之前就已经提到了类似的数组。

Fibonacci 数有两种定义,略有变化。两者非常相似,但同时几乎没有什么不同。

第一:
0, 1, 1, 2, 3, 5, 8, ...

第二:
1, 1, 2, 3, 5, 8, ...

如果仔细观察上面的序列,每个数字都被构造为前两个数字的总和。前两个数字是:零和一(或一和一)。

对于本文,我们将使用第一个定义。

Fibonacci(0) = 0,
Fibonacci(1) = 1,
Fibonacci(2) = Fibonacci(0) + Fibonacci(1) = 0 + 1 = 1
Fibonacci(3) = Fibonacci(1) + Fibonacci(2) = 1 + 1 = 2
Fibonacci(4) = Fibonacci(2) + Fibonacci(3) = 1 + 2 = 3

Fibonacci(n) = Fibonacci(n-2) + Fibonacci(n-1)。

斐波那契数的实现

有很多方法可以创建斐波那契数组,但我将展示两种最常见的方法。


第一种方法是使用递归实现。为此,您应该发现该模式并将其应用到如下所示的函数中。

long long 
FibonacciElement( long long n)
{
  if (n==0) return 0;
  if (n==1) return 1;
  return FibonacciElement(n-2) + FibonacciElement(n-1);  
}

现在,我强烈建议您采用 Fibonacci 数列的第 8 个元素,并在教科书或适合该任务的某些程序中使用二叉树结构计算它。

当你分析它时,你应该注意到有些元素被计算了几次,这是这种方法会更慢的原因之一,如果你使用内置记忆的编译器可以解决这个问题,有时你需要使用一些调整。

第二种方法不会使用如下所示的函数的自调用:

long long
FibonacciElement2( long long n)
{
   long long Previous   = 0,
             PPrevious  = 1;

long long i=2, Curent;
while( i <= n)
{
	Curent      = PPrevious + Previous;
	PPrevious = Previous;
	Previous   = Curent;
	++i;
}

	return Curent;
}

递归实现通常比那些没有自调用函数的要慢。

#include <iostream>

using namespace std;

long long FibonacciElement1(long long);
long long FibonacciElement2(long long);

int
main(void)
{
	cout<<"Calculate Fibonacci element"<<endl
		<<"enter the n -";
        long long int lliN; cin>>lliN;

	cout<<"With recursion F(n)    ="<<FibonacciElement1(lliN)<<endl
	    <<"Iterative solution F(n)="<<FibonacciElement2(lliN)<<endl;

	int iRespond; cin>>iRespond;

	return EXIT_SUCCESS;
}

long long 
FibonacciElement1( long long n)
{
  if (n==0) return 0;
  if (n==1) return 1;
  return FibonacciElement1(n-2) + FibonacciElement1(n-1);  
}

long long
FibonacciElement2( long long n)
{
   long long Previous   = 0,
             PPrevious  = 1;

if( n==0) return 0;
if( n==1) return 1;

long long i=1, Curent;
while( i <= n)
{
	Curent      = PPrevious + Previous;
	PPrevious   = Previous;
	Previous    = Curent;
++i;
}
return Curent;
}

我们已经讨论了斐波那契数是什么,并且我们已经看到了两种计算它们的方法。

我建议您通过深入研究来进一步研究这个主题。该算法也有一些实际应用。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。