我有一個遞回函式,它對整數范圍內的所有偶數求和。我現在的代碼可以正常作業,但看起來可以簡化。我試過把遞回函式放在不同的地方,但每次我都得到錯誤的答案。你們能告訴我如何縮短我的代碼嗎?
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);)
uj5u.com熱心網友回復:
好吧,有一個數學公式可以計算這個,但如果你真的需要遞回,你可以嘗試:
int sum_evens(int range_start, int range_end)
{
if (range_start > range_end) return 0;
int tmp = (is_even(range_start) == 0) ? range_start : 0;
return tmp sum_evens(range_start 1, range_end);
}
但請注意,這樣的遞回函式是“危險的”。像這樣呼叫它sum_evens(0, 2000000000)很可能會產生堆疊溢位。
因此,如果您不想使用數學公式,更好的方法是使用簡單的回圈。
int sum_evens(int range_start, int range_end) {
int sum = 0;
if (is_even(range_start) != 0) range_start; // Make range_start even
while(range_start <= range_end)
{
sum = range_start;
range_start = 2;
}
return sum;
}
順便提一句:
is_even當數字為偶數時,您的函式顯然回傳 0。這很不尋常,因為值 0 通常表示 false。但是,在上面我保持了相同的風格。
uj5u.com熱心網友回復:
我知道您想遞回地執行此操作,但就像評論所說的那樣,如果您正在尋找更好更快的解決方案,您可以使用簡單的迭代或實際的算術公式,據說
#include <stdio.h>
int sum_evens(int range_start, int range_end) {
printf("Entering sum function for range %d to %d\n",
range_start, range_end);
if (range_start > range_end) return 0;
int val = range_start % 2 == 0 ? range_start : 0;
return val sum_evens(range_start 1, range_end);
}
int main() {
int val = sum_evens(1, 10);
printf("\n%d", val);
return 0;
}
這里可以使用三元運算子,而不是使用 if else 陳述句將值添加到總和,然后再次呼叫該函式以啟動遞回
如果要使用 void 函式和指標
#include <stdio.h>
void sum_evens(int range_start, int range_end, int * initiator) {
printf("Entering sum function for range %d to %d\n", range_start, range_end);
if (range_start <= range_end) {
int val = range_start % 2 == 0 ? range_start : 0;
(*initiator) = val;
sum_evens(range_start 1, range_end, initiator);
}
}
int main() {
int sum = 0;
sum_evens(1, 3, &sum);
printf("\n%d", sum);
return 0;
}
使用迭代(for 回圈)
#include <stdio.h>
int sum_evens(int range_start, int range_end) {
int sum = 0;
for (int i = range_start; i <= range_end; i )
if (i % 2 == 0) sum = i;
return sum;
}
int main() {
int val = sum_evens(1, 10);
printf("\n%d", val);
return 0;
}
uj5u.com熱心網友回復:
沒什么可補充的,但我有一個習慣,首先撰寫基本條件,以減少執行時間和它將分配的空間,因為在這里您的函式也上升到 n 1,這是不必要的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/346482.html
