您如何解决不无效的递归

时间:2019-06-07 13:31:18

标签: c recursion

假设第二个股票经纪人只能进行一次购买,但可以 之后可以在任何一天卖出股票,即股票经纪人可以在某天购买股票 i(0 <= i <= n-2),并且可以在从i + 1天到n-1天的任何一天出售。 写一个函数 double get_max_profit(double price [],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。

我在此尝试了递归,但它没有给出该问题所需的最后一个值,就像给出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 个答案:

答案 0 :(得分:1)

首先,您似乎缺少返回值,而递归调用最终并没有返回,对于使用gcc作为编译器时函数仍然输出正确的值,我感到很沮丧。您不能依靠它,因为它是UB,但是,我没有检查您的算法是否正确,它只是给出了您期望的输出。其次,您的代码确实给了您发布的预期结果。最后,您的算法存在缺陷,因为如果您在另一个数据集上多次调用它,它将保留这些变量的静态值,可能会产生意外结果(例如,如果第二个数据集的值较低)。

正如注释中所指出的那样,在编译C代码时,如果编译器支持,请考虑使用-Wall和-pedantic(我个人更喜欢-pedantic-errors)选项,这些选项可以为您节省很多麻烦寻找这种错误。