【发布时间】:2021-12-17 04:42:50
【问题描述】:
我有一个递归函数,它将整数范围内的所有偶数相加。我现在的代码可以正常工作,但看起来可以简化。我尝试将递归函数放在不同的位置,但每次我得到错误的答案。你们能告诉我如何缩短我的代码吗?
int sum_evens(int range_start, int range_end)
{
int even_sum = 0; /* The inclusive sum of all even numbers within */
/* whole number range */
printf("\n Entering sum function for range %d to %d",
range_start, range_end);
if(range_start <= range_end)
{
if(is_even(range_start) == 0)
{
printf("\n Adding: %d", range_start);
even_sum = sum_evens(range_start + 1, range_end);
even_sum += range_start;
}
else
{
printf("\n Skipping: %d", range_start);
even_sum = sum_evens(range_start + 1, range_end);
}
}
printf("\n Exiting sum function for range %d to %d with result: %d",
range_start, range_end, even_sum);
return even_sum;
}
我基本上是想只有这条线 (even_sum = sum_evens(range_start + 1, range_end);)
【问题讨论】:
-
你可以用数学来简化它。忘记所有关于算法和递归函数和循环的事情,找到一个可以直接返回结果的算术公式。
-
请求改进工作代码的帮助更适合Code Review SE。
-
迭代地做。代码肯定会更简单。我猜 4-5 行代码,大约是你代码行数的一半,不包括 printfs。滥用递归从来都不是一个好主意
-
叹息。看,伙计们,基本上每个要求递归解决方案的问题都是学生练习。告诉他们不递归就这样做违反了练习的条款。当体育教练告诉学生运动员多次在举重机上举重时,您不会告诉他们效率低下,他们应该使用叉车或水平仪。他们需要举重来锻炼肌肉,学生需要通过编写在锻炼之外毫无意义的代码来锻炼和锻炼大脑。
-
这不是简单的等差数列吗?从 1-N,同时跳过小于
range_start的那些?或者换句话说,从 1 到 N 的偶数和减去从 1 到range_start的偶数和?