递归方程实现问题



几个月前,我接到了一个作业,里面有一些随机组件。一个是递归函数,它有很多绒毛,但不应该太难。但是,我不知道怎么写。我已经回到了它,我仍然无法完全弄清楚。如果您愿意,可以在此处查看完整的作业: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 是 + 或 -。执行的除法是带有截断的通常整数除法。

得到了一个半工作程序,但首先,它使用了一些全局变量,其次,我收到警告"递归.cpp:37:警告:控制到达非无效函数的末尾",最重要的是,它实际上不起作用。我给出的结果不正确,但它比我最初无法给出结果的尝试要好。请帮助我了解如何让这件事工作,我花的时间比我想自己尝试的时间要多。

这应该在 unix 机器上运行,具有可执行调用,后跟命令行参数。像这样: 提示> ./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;
}

感谢您的帮助!

你的主要问题是你没有为你的函数提供第一个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.

另一方面,使用全局变量不是好的做法。您可以使用函子编写更好的代码。

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。

最新更新