Вопрос реализации рекурсивного уравнения

0

Несколько месяцев назад мне дали задание, в котором было несколько случайных компонентов. Одна из них была рекурсивной функцией, которая имела много пуха, но не должна была быть слишком сложной. Однако я не мог понять, как его написать. Я вернулся к этому, и я все еще не могу понять. Вы можете увидеть полное назначение здесь, если хотите: 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;
}

Спасибо за помощь!

  • 0
    Похоже, я видел этот код раньше. # 1: не используйте глобалы
  • 0
    правда, все мои другие попытки были действительно грязными. Я не думаю, что есть большая проблема с глобалами в таком случае, как это простая программа с двумя функциями.
Теги:
recursion

1 ответ

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.

  • 0
    Моя челюсть только что упала. Как в буквальном смысле. Фактический лицевой мазок только что произошел. Все это время я рассматривал его как Arg-Op или ArgOp или что-то в этом роде. Вау, я не могу поверить, что позволил себе получить неудовлетворительную оценку по этому заданию, потому что я не мог смотреть Ну, кроме моей глупой слепоты, ваше решение моих глобальных переменных приятно и имеет гораздо больше смысла, чем то, что я пытался сделать раньше (я попробовал некоторые странные вещи ...).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню