#21189: 遞迴與邏輯運算子的短路


nevikw39 (牜攵)

學校 : 國立臺中第一高級中學
編號 : 89903
來源 : [140.114.207.96]
最後登入時間 :
2023-05-16 17:02:16
e156. 良心題: 求和 | From: [106.107.240.191] | 發表日期 : 2020-04-27 22:20

發現現在台面上的題解沒有一個正經的, ZeroJudge 應該要改成按照評分而非時間來排解題報告 XD

大家安安 o'_'o

這題應該都會想到 Sigma,但是題目有不少限制。

讓我們挑戰看看吧

提示裡面說到遞迴,可是如何不用 if 終止遞迴?

C 的邏輯運算子有些特性,像是 || 在實作時只要第一個條件成立編譯器就不會理會第二個條件;同樣地,&& 在第一個條件即為偽時則直接跳過。運用此特性在大筆測資時可有效減少條件判斷之次數。

另外一個有趣的特性是,對於 C 運算式可以當作陳述式,賦值的陳述式可以當作運算元。也就是說,常常有人寫出這種討人厭的寫法:

if (-1 != f = fopen(...))

{

    ...

}

利用此特性,我們同樣可以寫出這個函式 f:

int f(int x)
{
    printf("%d\n", x);
    x && f(x - 1);
    return x;
}

你大概可以想像,這個函式會遞迴 x + 1 次。

現在,你需要把他改寫為遞迴求和。

 
#21198: Re:遞迴與邏輯運算子的短路


jiangsir (jiangsir)

學校 : 國立高雄師範大學附屬高級中學
編號 : 2
來源 : [163.32.92.91]
最後登入時間 :
2024-05-08 15:56:54
e156. 良心題: 求和 | From: [163.32.92.91] | 發表日期 : 2020-04-29 09:12

發現現在台面上的題解沒有一個正經的, ZeroJudge 應該要改成按照評分而非時間來排解題報告 XD

大家安安 o'_'o

這題應該都會想到 Sigma,但是題目有不少限制。

讓我們挑戰看看吧

提示裡面說到遞迴,可是如何不用 if 終止遞迴?

C 的邏輯運算子有些特性,像是 || 在實作時只要第一個條件成立編譯器就不會理會第二個條件;同樣地,&& 在第一個條件即為偽時則直接跳過。運用此特性在大筆測資時可有效減少條件判斷之次數。

另外一個有趣的特性是,對於 C 運算式可以當作陳述式,賦值的陳述式可以當作運算元。也就是說,常常有人寫出這種討人厭的寫法:

if (-1 != f = fopen(...))

{

    ...

}

利用此特性,我們同樣可以寫出這個函式 f:

int f(int x)
{
    printf("%d\n", x);
    x && f(x - 1);
    return x;
}

你大概可以想像,這個函式會遞迴 x + 1 次。

現在,你需要把他改寫為遞迴求和。


嗯。可以思考增加點讚功能。

 

 
ZeroJudge Forum