我不明白如何递归地编写函数

时间:2019-04-14 09:39:41

标签: c++ recursion

因此,我需要在另一个函数中递归调用一个函数。 我有一个数组,函数中的前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)

1 个答案:

答案 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
    }
}

对于递归情况(即实际计算结果),您需要使用累加器和当前元素(*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));
}