C ++中的递归帮助

时间:2014-04-08 22:45:42

标签: c++ recursion

该任务是设计和开发一个C ++程序,列出Fibonacci系列的前N个术语。

输出应如下所示:

  • N = 2 1,1
  • N = 2 1,1
  • N = 3 1,1,2
  • N = 4 1,1,2,3
  • N = 5 1,2,3,5
  • N = 6 ....

我的问题是我已经编写了下面的递归函数,但我不知道如何格式化它以便以上述方式输出到屏幕。

#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);

}

有人可以说明如何完成这项工作吗?

谢谢。

5 个答案:

答案 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