Рекурсивная помощь в C ++

0

Назначение - это разработка и разработка программы C++ для перечисления первых 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);

}

Может ли кто-то пролить свет на то, как добиться этого?

Спасибо.

  • 0
    Возможный дубликат stackoverflow.com/questions/22949666/recursion-help-in-c
  • 0
    Спасибо всем. Вы, ребята, очень помогли направить меня в правильном направлении. Я ценю всю вашу помощь.
Теги:
recursion

5 ответов

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;
  }
}

Вам нужно будет отсортировать пробелы и форматировать, но это суть.

Изменить: согласно комментарию agbinfo: удалили печать 1, а также сохранили переменные, поэтому нам не нужно их дважды называть. (Тем не менее, для эффективности взгляните на ответ Мариуса :)).

  • 0
    Это не сработает. cout << 1 не помогает, но, что более важно, fib_verbose(nx) будет выполняться рекурсивно. Вы, вероятно, хотите cout << fib_verbose(n-2) << fib(n-1);
  • 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

Я бы принял другой подход. Я бы сохранил уже рассчитанные значения Фибоначчи, чтобы они не вычисляли их снова и снова, как на карте, и не использовали эту карту для печати значений.

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;
}
  • 0
    Это спасло бы вас от двойных запусков и было бы более эффективным (как подсказал мой ответ, оно не было направлено на повышение эффективности).
  • 0
    Есть ли причина не использовать std::vector ?
Показать ещё 1 комментарий
1

Как отформатировать?

У вас хорошее начало. Попробуйте это как следующий шаг...

for (int x = 0; x < 15; x++)
   cout << x << "=" << fib(x) << " " << std::endl;

cin.get();

В моей системе я могу добавить в строку cout, скомпилировать и просмотреть результат в <10 секунд. Быстро оборачивайтесь и практикуйте (для вас) ваши друзья.

  • 0
    Это даст вам 0-15 в качестве первых элементов в каждой строке, где ОП хочет "N (fib_result_here) (фиб частичные результаты здесь)"
  • 0
    @Noctis - Спасибо, я согласен. Моя цель состояла в том, чтобы побудить его попробовать, поскольку он не показал никакой попытки. Мне также было интересно, понял ли он, что должен был показать стол. Я, вероятно, должен был просто добавить комментарий к его представлению. Я считаю постоянной проблемой просто дать очевидным ученикам ответ.
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
  • 0
    @ DOUGLASO.MOEN Я думаю, что так и есть. Он не отформатирован точно так, как запрошено, но вызов fib(n) выводит первые n членов последовательности Фибоначчи.
  • 0
    Обновлен для печати таблицы точно в соответствии с просьбой.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню