递归方程实现问题

时间:2014-12-05 18:30:45

标签: c++ recursion

几个月前,我接到了一项任务,其中包含一些随机组件。一个是递归函数,它有很多绒毛,但不应该太难。但是,我无法弄清楚如何写它。我已经回去了,我仍然无法弄明白。如果您愿意,可以在此处查看完整的作业:http://www.cs.fsu.edu/~asriniva/courses/DS14/projs/proj2.html

我只处理名为main.cpp的部分: 这是一个评估递归函数的程序。它与作业的前一部分无关。命令:./ recurse N1 C1 A1 M1 M2 M3 M4 D1 D2 S1 S2 Arg Op将使递归评估下面给出的功能和应答输出。该功能定义如下。

f(N) = 0, if N < N1

f(N1) = C1

f(N)= A1 + M1*f(M2*N/D1 - S1) Op M3*f(M4*N/D2 - S2), if N > N1

这里,需要评估f(Arg)。 N1 C1 A1 M1 M2 M3 M4 D1 D2 S1 S2,Arg是整数,Op是+或 - 。执行的除法是通常的截断整数除法。

我有一个半工作程序,但是,首先,它使用一些全局变量,第二,我得到一个警告&#34; recurse.cpp:37:警告:控制到达非空函数的结束&#34;,和最重要的是,它实际上并不起作用。我给出的结果不正确,但它比我原本无法实际给出结果的尝试更好。请帮助我了解如何让这件事工作,我花了更多的时间,而不是自己尝试。

这应该在具有可执行调用然后是命令行参数的unix机器上运行。像这样:提示&gt; ./recurse 2 3 2 1 2 0 1 3 6 0 0 18 +

13(节目输出)

#include <iostream>
#include <cstdlib>
using namespace std;

char * Op;
int N1;
int C1;
int A1;
int M1;
int M2;
int M3;
int M4;
int D1;
int D2;
int S1;
int S2;


int recurse(int N){

if (N < N1){
    return 0;
}
if (N == N1){
    return C1;  
}
if (N > N1){

    if (*Op == '+')
        return (A1 + M1 * recurse((M2*N / D1 - S1)) + M3 * 
            recurse((M4*N / D2 - S2)));
    else 
        return (A1 + M1 * recurse((M2*N / D1 - S1)) - M3 * 
            recurse((M4*N / D2 - S2)));
}
}


int main(int argc, char* argv[]){

N1 = atoi(argv[1]);
C1 = atoi(argv[2]);
A1 = atoi(argv[3]);
M1 = atoi(argv[4]);
M2 = atoi(argv[5]);
M3 = atoi(argv[6]);
M4 = atoi(argv[7]);
D1 = atoi(argv[8]);
D2 = atoi(argv[9]);
S1 = atoi(argv[10]);
S2 = atoi(argv[11]);
Op = argv[12];

int val;
if (*Op == '+')
    val = ( ( A1 + M1 * recurse(M2 / D1 - S1) + M3 * 
        recurse(M4 / D2 - S2) ) );
else 
    val = ( ( A1 + M1 * recurse(M2 / D1 - S1) - M3 * 
        recurse(M4 / D2 - S2) ) );

cout << val << endl;


return 0;
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您的主要问题是您没有为您的功能提供第一个N。您正在初始化12个变量:

N1 = atoi(argv[1]);
C1 = atoi(argv[2]);
A1 = atoi(argv[3]);
M1 = atoi(argv[4]);
M2 = atoi(argv[5]);
M3 = atoi(argv[6]);
M4 = atoi(argv[7]);
D1 = atoi(argv[8]);
D2 = atoi(argv[9]);
S1 = atoi(argv[10]);
S2 = atoi(argv[11]);
Op = argv[12];

但是,您将13个参数传递给命令:N1 C1 A1 M1 M2 M3 M4 D1 D2 S1 S2 Arg Op。所以你没有收集Arg的值,我猜我必须存储在N中。

另一方面,使用全局变量不是好习惯。您可以使用functor编写更好的代码。

struct Recurse
{
    Recurse(){}
    int N1, C1, A1, M1, M2, M3, M4, D1, D2, S1, S2;
    string Op; // Since you're using C++ you can use string instead char *.
    int operator()(int N);
};


int Recurse::operator()(int N)
{
    if (N < N1)
        return 0;

    if (N == N1)
        return C1;

    if (N > N1)
    {
        if (Op == "+")
        {
            return (A1 + M1 * this->operator()((M2*N / D1 - S1)) + M3 * this->operator()((M4*N / D2 - S2)));
        }
        else
        {
            return (A1 + M1 * this->operator()((M2*N / D1 - S1)) - M3 * this->operator()((M4*N / D2 - S2)));
        }
    }

}

<强>用法:

int main(int argc, char *argv[])
{

    int N; // It seems you missed this.

    Recurse recurse;
    recurse.N1 = atoi(argv[1]);
    recurse.C1 = atoi(argv[2]);
    recurse.A1 = atoi(argv[3]);
    recurse.M1 = atoi(argv[4]);
    recurse.M2 = atoi(argv[5]);
    recurse.M3 = atoi(argv[6]);
    recurse.M4 = atoi(argv[7]);
    recurse.D1 = atoi(argv[8]);
    recurse.D2 = atoi(argv[9]);
    recurse.S1 = atoi(argv[10]);
    recurse.S2 = atoi(argv[11]);

    N = atoi(argv[12]);    // Again, you forgot this.

    recurse.Op = string(argv[13]);

    cout << recurse(N) << endl;
    return 0;
}

使用输入数据,您提供的输出为13。