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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我不明白如何递归地编写函数相关的知识,希望对你有一定的参考价值。

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

这是一个“左折”;你可以在很多地方在线阅读。

在每一步中,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));
}

以上是关于我不明白如何递归地编写函数的主要内容,如果未能解决你的问题,请参考以下文章

Python - 递归公式

返回函数调用与仅在递归期间再次调用函数有啥区别?

递归调用后的代码递归

如何编写递归函数javascript push我的数组属性Json对象?

递归函数:有人能解释一下这段代码是如何打印 1 到 5 的吗?

在字典中递归查找键