繁体   English   中英

您如何解决不无效的递归

[英]How do you solve recursion which are not void

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM