我只处理名为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;
}
感谢您的帮助!
答案 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。