因此,我需要在另一个函数中递归调用一个函数。
我有一个数组,函数中的前2个参数是数组开头和结尾处的指针。第三个参数是我需要递归调用的函数,第四个参数是我将其命名为<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.7.0/fabric.js"></script>
<button onclick='changeSrc()'>changeSrc</button>
<button onclick='addFilter()'>addFilter</button><br>
<canvas id="editorCanvas"></canvas>
的默认值;
假设该数组具有元素:a_0
。
我的函数Result需要计算这个:
a_1, a_2, a_3, ... , a_n
这是练习,考试的任务,我并不真正理解递归原理(我理解阶乘),但是我不理解此示例。
f(...f(f(f(a_0,a_1),a_2),a_3),...,a_n)
答案 0 :(得分:0)
这是“左折”;您可以在线上许多地方阅读它。
在每个步骤中,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”不是一个很好的名字,因为它很少是初始值,所以我将其重命名为“ accumulator”。
从基本情况开始通常是递归时的好主意。
这是一个空数组,它应该返回累加值(我们可以假定它已经被计算出来了,因为这就是我们要做的)。
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));
}