[英]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.