假设第二个股票经纪人只能进行一次购买,但可以 之后可以在任何一天卖出股票,即股票经纪人可以在某天购买股票 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);
}
答案 0 :(得分:1)
首先,您似乎缺少返回值,而递归调用最终并没有返回,对于使用gcc作为编译器时函数仍然输出正确的值,我感到很沮丧。您不能依靠它,因为它是UB,但是,我没有检查您的算法是否正确,它只是给出了您期望的输出。其次,您的代码确实给了您发布的预期结果。最后,您的算法存在缺陷,因为如果您在另一个数据集上多次调用它,它将保留这些变量的静态值,可能会产生意外结果(例如,如果第二个数据集的值较低)。
正如注释中所指出的那样,在编译C代码时,如果编译器支持,请考虑使用-Wall和-pedantic(我个人更喜欢-pedantic-errors)选项,这些选项可以为您节省很多麻烦寻找这种错误。