Fboinacci数列

Fibonacci数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称“兔子数列”,其数值为:1、1、2、3、5、8、13、21、34……在数学上,这一数列以如下递推的方法定义:F(0)=1,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)。
1202年,斐波那契在《计算之书(Liber Abaci)》中提出了斐波那契数列。根据该数列可折叠出斐波那契蜗牛;绘制出斐波那契螺旋线等。 此外,在现代物理、准晶体结构、化学等领域,该数列均有直接应用;为此,美国数学会从1963年起出版了一份名为《斐波那契数列季刊》的数学杂志,以专门刊载相关研究成果。



Fibonacci数列的递归公式为:F(0)=1,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)



c++实现

可以很简单的通过数值之间的赋值配合循环即可得出答案(在一定范围内,根据设置的类型不同能算出的最大位不同)

#include<bits/stdc++.h>
using namespace std;
int main(){
	int f1,f2,fn;
	f1=1;
	f2=1;
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		fn=f1+f2;
		f1=f2;
		f2=fn;
	}
	cout<<fn;
	return 0;
		
}
// 1 1 2 3 5 8 13 21 34 55 89...
//f1 f2 f3 f4 f5...

但如果要实现大项的计算的话则不能使用简单的递归算法,需要用到非递归式的做法

#include <bits/stdc++.h>
using namespace std;
string strAdd(string a, string b)
{
	unsigned short j=0,k=0;
	string c;
	size_t n = b.size();
	if (a.size()<n) a='0'+a;
	for (size_t i=n;i>0;i--){
		k=(a[i-1]-'0')+(b[i-1]-'0')+j;
		if (k>9){
			c+=(k-10)+'0';
			j=1;
		}
		else{
			c+=k+'0';
			j=0;
		}
	}
	reverse(c.begin(),c.end());
	if (j==1) c='1'+c;
	return c;	
}
 
string fib1(long n)  //定义递推法
{
	string a = "1";
	string b = "1";
	string c; 
	
	for (auto i=3; i<=n; ++i){
        c = strAdd(a,b);
        a = b;
        b = c;
    }
    
    return c;
}
 
string fib2(long n)  //递归法太耗时间
{
	string c;
	if (n <= 2)
		c = "1";
	else
		c = strAdd(fib2(n-1), fib2(n-2));
 
	return c;
}
 
string fib3(long n)  //用容器时间差不多,太耗内存空间
{
	string c;
	vector<string>arr;
	arr.push_back("1");
	arr.push_back("1");
	for (int i = 2; i < n; i++)
		arr.push_back(strAdd(arr.at(i-2),arr.at(i-1)));
	return arr.back();
}
 
int main(void)
{	
    string c;
    stringstream s;
	int i=100000;
    c = fib1(i);
    
	s << c << endl << endl << "第" << i 
	  <<"项的长度:"<< c.size() << endl;
	cout << s.str();
	
	ofstream out_file("Fibonacci.txt");
    if (out_file){
    	out_file << s.str();
    	out_file.close();
    }
 
	return 0;
}

实现结果



但其实即使使用了这种方法,也不能在短时间内算出大项的数值,计算机也需要长时间的去计算

GDB 调试

在华为云鲲鹏系统操作系统下,进行gdb调试,图片依次实施的是gdb对栈堆的调试命令中的back trace 简称bt,需要配合条件断点使用,栈的详细编号也可以在被暂停后查看到;frame简称f,f可以切换栈,来查看不同栈的信息;up/down也可以实现切换栈,但通常是相邻上下栈的切换;info命令可以查看各种变量的值,info frame 可以简写为i f



posted @ 2023-11-03 23:51  Raymongillichmks  阅读(16)  评论(0编辑  收藏  举报