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

问题描述 投票:-4回答:1

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

这是练习的任务,对于考试而言,我并不理解真正的递归原理(我理解Factorial)但我不明白这个例子。

 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)
 }
c++ recursion
1个回答
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));
}
© www.soinside.com 2019 - 2024. All rights reserved.