该任务是设计和开发一个C ++程序,列出Fibonacci系列的前N个术语。
输出应如下所示:
我的问题是我已经编写了下面的递归函数,但我不知道如何格式化它以便以上述方式输出到屏幕。
#include <iostream>
using namespace std;
//Function Prototype
int fib(int);
int main()
{
for (int x = 0; x < 15; x++)
cout << fib(x) << " ";
cin.get();
cin.get();
return 0;
}
//Definition of fib
int fib(int n)
{
//Return 1 when n is 0
if ( n <= 0 )
return 0;
else if (n == 1)
return 1;
else
return fib(n-1) + fib(n-2);
}
有人可以说明如何完成这项工作吗?
谢谢。
答案 0 :(得分:1)
如果你不太关心效率,那么双循环就可以了
for (int x = 2; x < 15; x++) {
cout << "N = " << x << " ";
for (int y = 2; y <= x; y++)
cout << fib(y) << " ";
cout << endl;
}
答案 1 :(得分:1)
由于这一切都是打印斐波那契数字和以前的数字,你只需要将它们添加到你的输出...... 您可以拥有一个传递的聚合字符串,它将包含所有临时值,或者只调用另一个具有临时输出的方法。 (请注意,它虽然效率不高:)
int fib_verbose(int n)
{
//Return 1 when n is 0
if ( n <= 0 )
return 0;
else if (n == 1) {
return 1;
}
else {
int smaller = fib(n-2);
int larger = fib(n-1);
cout << smaller << " " << larger << endl;
return smaller + larger;
}
}
你必须整理空格和格式,但这就是要点。
修改强>
根据{{1}}评论:删除了agbinfo
打印,并存储了变量,因此我们无需再调用两次。 (尽管如此,为了提高效率,请看Marius的回答:))。
答案 2 :(得分:1)
如何格式化?
你有个好的开始。 尝试下一步......
for (int x = 0; x < 15; x++)
cout << x << "=" << fib(x) << " " << std::endl;
cin.get();
在我的系统中,我可以添加到cout行,编译并查看&lt;中的输出。 10秒快速转身,练习(为你)是你的朋友。
答案 3 :(得分:1)
我会采取不同的方法。我会保存已经计算过的Fibonacci值,这样就不会像在地图中一样反复计算它们,而是使用该地图打印值。
std::map<int, int> fibs;
int fib(int const n)
{
auto p = fibs.find(n);
if(p != fibs.end())
return p->second;
int f = 1;
if (n > 1)
{
f = fib(n-1) + fib(n-2);
}
fibs[n] = f;
return f;
}
然后你可以像这样循环计算出来的值:
for(int n = 0; n < 10; ++n)
{
fib(n);
std::cout << "N=" << n << " ";
for(int i = 0; i <= n; ++i)
std::cout << fibs[i] << ",";
std::cout << std::endl;
}
答案 4 :(得分:0)
这是一个在为单个值调用fib
时不会重新计算值的示例。您可以将Marius的想法结合起来,即使在多次运行中也能计算一次。
诀窍是fib(unsigned&, unsigned)
将返回它已经计算过的先前的斐波那契。
#include <iostream>
using namespace std;
unsigned fib(unsigned& m, unsigned n)
{
if (n==0) {
return 0;
}
if (n==1) {
m = 0;
// cout << "0,"; // uncomment if sequence should start with a 0
return 1;
}
unsigned prev;
m = fib(prev, n-1);
cout << m << ",";
return m+prev;
}
unsigned fib(unsigned n) {
unsigned prev;
unsigned f = fib(prev, n);
cout << f;
return f;
}
int main() {
for (unsigned i=2; i<13; i++) {
cout << "N=" << i << " ";
fib(i);
cout << endl;
}
return 0;
}
将打印输出:
N=2 1,1
N=3 1,1,2
N=4 1,1,2,3
N=5 1,1,2,3,5
N=6 1,1,2,3,5,8
N=7 1,1,2,3,5,8,13
N=8 1,1,2,3,5,8,13,21