Несколько месяцев назад мне дали задание, в котором было несколько случайных компонентов. Одна из них была рекурсивной функцией, которая имела много пуха, но не должна была быть слишком сложной. Однако я не мог понять, как его написать. Я вернулся к этому, и я все еще не могу понять. Вы можете увидеть полное назначение здесь, если хотите: 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 - либо +, либо -. Выполненное деление - это обычное целочисленное деление с усечением.
Я получил полурабочую программу, но во-первых, она использует некоторую глобальную переменную, во-вторых, я получаю предупреждение "recurse.cpp: 37: warning: control достигает конца не-void функции", и, что самое главное, фактически произведение. Я даю результат, который неверен, но лучше, чем моя первоначальная попытка, которая не может дать результат. Пожалуйста, помогите мне понять, как заставить эту работу работать, я потратил больше времени, чем я хотел бы попробовать сам.
Предполагается, что он запускается на unix-машине с исполняемым вызовом, за которым следуют аргументы командной строки. Например: Prompt>./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.