Как вы решаете рекурсии, которые не являются недействительными - PullRequest
0 голосов
/ 07 июня 2019

Предположим, что второй биржевой маклер может совершить только одну покупку, но может продать ее в любой день после этого, то есть биржевой маклер может приобрести акцию в какой-то день i (0 <= i <= n - 2),и может продать его в любой день, начиная с дня i + 1 до дня n - 1. Напишите функцию double get_max_profit (double values ​​[], int n), которая возвращает максимальную прибыль, которую этот второй биржевой маклер может получить, учитывая цены массива и егоразмер n в качестве ввода.Функция должна вернуть 0, если максимальная прибыль меньше или равна 0. Например: • Если цены = {1.0, 5.1, 7.3, 9.4, 4.7, 8.0, 15.0, 6.2} и n = 8, функция должна вернуть14,0.Биржевой маклер должен купить акцию в день 0 и продать ее в день 6, где максимальная прибыль составляет цены [6] - цены [0] = 15,0 - 1,0 = 14,0. </p>

Я пытался рекурсивно в этомно это не дает последнее значение, которое требуется для этого вопроса, как это дает 9.1, но в конце выводит ноль

double get_max_profit(double prices[], int n){
    static int day = 0;
    static double max_profit = 0.0;
    printf("the profit is %lf the day is %d\n", max_profit, day);
    if (day >= n-1){
        if (max_profit <=0){
            return 0;
        }
        return max_profit;
    }
    for (int i = day; i < n; i++){
        if (day+1 >= n){
            if (max_profit <=0){
                return 0;
            }
            return max_profit;
        }
        double profit = prices[i] - prices[day];
        if (profit > max_profit){
            max_profit = profit;
        }

    }
    day = day +1;
    get_max_profit(prices, n);
}

int main(int argc, char *argv[]) {
    double prices[] =  {2.1, 5.3, 7.7, 9.8, 1.2, 10.3, 5.0};
    int n = 7;
    double max_lim = get_max_profit(prices, n);
    printf("maximum profit is %lf \n", max_lim);
}

1 Ответ

1 голос
/ 07 июня 2019

Во-первых, вы, кажется, пропускаете возврат, рекурсивный вызов не возвращается в конце, и меня смущает тот факт, что функция все еще выдает правильное значение при использовании gcc в качестве компилятора.Вы не можете полагаться на это, потому что это UB, тем не менее, я не проверял, корректен ли ваш алгоритм или нет, он просто дает ожидаемый результат.Во-вторых, ваш код дает мне ожидаемый результат, который вы опубликовали.Наконец, ваш алгоритм имеет недостатки, потому что если вы вызываете его более одного раза для другого набора данных, он сохранит статическое значение этих переменных, что, возможно, даст неожиданный результат (например, если второй набор данных имеет более низкие значения).

Как указано в комментариях, когда вы компилируете свой код C, если ваш компилятор поддерживает его, рассмотрите возможность использования опций -Wall и -pedantic (я лично предпочитаю -pedantic-errors), которые могут вас спасти.проблем при поиске такого рода ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...