-2

我的代码有问题。有一个斐波那契函数,我希望你知道它是做什么的。还有两个文件: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;
}
4

3 回答 3

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 两次来复制的。

于 2012-11-08T13:49:52.233 回答
0

因为您使用的是递归函数。它计算斐波那契的总和,直到你从 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);
}

没尝过,但就是这个想法。

于 2012-11-08T13:52:26.160 回答
0

考虑将行更改outputFile << tmp << ", ";

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

如果您想列出序列(正如您的问题和代码所暗示的那样)。

于 2012-11-08T13:53:34.147 回答