【问题标题】:Fibonacii's algorithm in C++ - recursively [closed]C ++中的斐波那契算法 - 递归[关闭]
【发布时间】:2012-11-08 13:40:46
【问题描述】:

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

【问题讨论】:

  • 但是帖子中的代码,没有包含指向它的链接。
  • 举例说明你的输入、实际输出和预期输出。从问题中不清楚问题是什么。
  • 我不明白。你告诉它在文件中写入一个数字,你不知道它为什么在其中写入一个数字?
  • 在这里工作,有什么问题?
  • 问题是输出文件中没有算法的序列号。

标签: c++ algorithm fibonacci


【解决方案1】:
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 被复制。

【讨论】:

  • 关于更改代码会说得更清楚吗? :)
  • 恐怕我不明白你在寻找什么输出,否则我无法编写代码来做到这一点。
  • In0201.txt 400 Out0201.txt n=400 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377
  • 错误 C2660:'fib':函数不接受 2 个参数错误 C2065:'outputFile':未声明的标识符错误 C2228:'.is_open' 左侧必须有类/结构/联合错误 C2660:' fib' : 函数不接受 1 个参数
  • 也许您可以将整个更改后的程序粘贴到这里?
【解决方案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);
}

没有尝过,但就是这个主意。

【讨论】:

  • 我不确定将数字添加到 ofstream 的顺序是否符合 Maciej 的要求。但是,是的,这正是我们所需要的排序
  • error C2660: 'fib' : function does not take 1 arguments
  • 由于他将定义更改为同时获取数字和 ofstream,因此您还必须更改 fib 内部对 fib 的递归调用。又名openFile &lt;&lt; fib(n-1, openFile) + fib(n-2, openFile) &lt;&lt;", ";
  • 这不会打印每个数字太多次吗?它将在第 N 个序列处打印 fib(N) 以及在 fib(N+1) 和 fib(N+2) 的递归调用中使用它时。
  • 我不知道如何解决它。如果我没有问题,我不会问。感谢所有通过我的问题回答的人。
【解决方案3】:

考虑将outputFile &lt;&lt; tmp &lt;&lt; ", "; 行改为

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

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

【讨论】:

  • 这应该可以解决问题,如果你想要从 0 到 yes 的序列
猜你喜欢
  • 2014-01-08
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多