[英]Trying to write a simple Blackjack, but there are errors I don't understand
[英]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
}
}
對於遞歸情況 - 即實際計算結果 - 您需要使用累加器和當前元素( *p
或p[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.