-2

コードに問題があります。フィボナッチの機能があります。あなたが何をしているのか知っているといいのですが。そして、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 を 2 回呼び出すことによって結果が複製されるため、結果の半分を無視することです。

于 2012-11-08T13:49:52.233 に答える
0

再帰関数を使用しているためです。0201.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 に答える