Алгоритм Фибоначчи в рекурсивном

У меня проблема с моим кодом. Есть функция Фибоначчи, которая, я надеюсь, вы знаете, что делает. И там два файла: In0201.txt и Out0201.txt. Также программа должна получить значение из файла «In0201.txt» и записать результаты в Out0201.txt.

Записывается некоторое значение, но вместо записи последовательности чисел (в файл) записывается значение, как если бы оно было суммой всех этих чисел из последовательности. Кто-нибудь знает, почему это происходит?

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

//Fibonacci
long double fib(int n) {
if(n == 0)
{
return 0;
}

if(n == 1)
{
return 1;
}

return fib(n-1) + fib(n-2);
}

int main()
{
int a;
int tmp;

ifstream inputFile("In0201.txt");
if (inputFile.is_open()) {
inputFile >> a;
cout << "Loaded the value 'n' from file: " << endl;
cout << a << " " << endl;
inputFile.close();
}

ofstream outputFile("Out0201.txt");
if (outputFile.is_open()) {
tmp = fib(a);
cout << "Fibonacci's sequence number: " << tmp << endl;
outputFile << tmp << ", ";
outputFile.close();
}
return 0;
}

-2

Решение

if (outputFile.is_open()) {
tmp = fib(a);
cout << "Fibonacci's sequence number: " << tmp << endl;
outputFile << tmp << ", ";
outputFile.close();
}

Этот код выведет в файл одно целое число, за которым следует запятая. Если вы хотите вывести каждое из возвращаемых значений из fib(int n) тогда вам нужно будет реструктурировать свой код так, чтобы строка, которую вы хотите записать в файл, добавлялась в рекурсивный цикл.

Решение

 long double fib(int n, ofstream &openFile) {
if(n == 0)
{
return 0;
}

if(n == 1)
{
openFile<<1<<", ";
return 1;
}
ofstream dummyStream;
long double nextFib = fib(n-1, openFile) + fib(n-2, dummyStream);
openFile<< nextFib <<", ";
return nextFib;
}int main()
{
int a;

ifstream inputFile("In0201.txt");
if (inputFile.is_open()) {
inputFile >> a;
cout << "Loaded the value 'n' from file: " << endl;
cout << a << " " << endl;
inputFile.close();
}

ofstream outputFile("Out0201.txt");
if (outputFile.is_open()) {
outputFile << 0 << ", ";
fib(a, outputFile);
outputFile.close();
}
return 0;
}

Цель dummyString это игнорировать половину результатов, так как они дублируются путем вызова FIB дважды.

2

Другие решения

Потому что вы используете рекурсивную функцию. Он рассчитывает сумму Фибоначчи до числа, которое вы из in0201.txt

Вы должны изменить функцию следующим образом:

long double fib(int n, ofstream openFile) {

if(n == 0)
{
openFile<<0<<", ";
return 0;
}

if(n == 1)
{
openFile<<1<<", ";
return 1;
}
openFile<< fib(n-1) + fib(n-2)<<", ";
return fib(n-1) + fib(n-2);
}

Не пробовал, но это идея.

0

Рассмотрите возможность изменения строки outputFile << tmp << ", "; в

for(int i = 0; i < a; i++)
outputFile << fib(i) << ", ";
outputFile << fib(a) << endl;

Если вы хотите перечислить последовательность (как подразумевается ваш вопрос и код).

0
По вопросам рекламы [email protected]