簡體   English   中英

我不明白如何遞歸地編寫函數

[英]I don't understand how to write functions recursively

所以我需要在另一個函數中遞歸調用一個函數。 我有一個數組,函數中的前 2 個參數是數組開頭和末尾的指針。 第三個參數是我需要遞歸調用的函數,第四個參數是我命名為a_0的默認值; 假設數組有元素: a_1, a_2, a_3, ... , a_n 我的函數 Result 需要計算這個:

f(...f(f(f(a_0,a_1),a_2),a_3),...,a_n)

這是練習,考試的任務,我真的不理解遞歸原理(我理解階乘)但我不理解這個例子。

 int Result(int *p, int *q,int (*f)(int, int), int a_0=0) {
      //I need to return this: f(...f(f(f(a_0,a_1),a_2),a_3),...,a_n)
 }

這是一個“左折疊”; 你可以在網上很多地方讀到它。

在每一步中, a_0應該是到目前為止“累積”的值; 也就是說,如果輸入數組為arr且初始值為a0 ,則其值為

a0
f(a0, arr[0])
f(f(a0, arr[0]), arr[1])
f(f(f(a0, arr[0]), arr[1]), arr[2])
...

“a_0”不是一個很好的名字,因為它很少是初始值,所以我將它重命名為“累加器”。

在遞歸時,從基本情況開始通常是一個好主意。
這是一個空數組的情況,它應該返回累積值(我們可以假設它已經被計算過,因為這就是我們要做的)。

int Result(int *p, int *end, int (*f)(int, int), int accumulator=0) 
{
    if (p >= end)
    {
        return accumulator;
    }
    else
    {
        // To be determined
    }
}

對於遞歸情況 - 即實際計算結果 - 您需要使用累加器和當前元素( *pp[0] )來產生一個新值來傳遞,然后遞歸數組的其余部分

int Result(int *p, int *end, int (*f)(int, int), int accumulator=0) 
{
    if (p >= end)
    {
        return accumulator;
    }
    else
    {
        return Result(p + 1, end, f(accumulator, *p));
    }
}

或者,更短

int Result(int *p, int *end, int (*f)(int, int), int accumulator=0) 
{
    return p >= end
          ? accumulator
          : Result(p + 1, end, f(accumulator, *p));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM