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