我不明白如何递归地编写函数
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
}
}
对于递归的情况 - 也就是实际计算结果 - 你需要使用累加器和当前元素(*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));
}
以上是关于我不明白如何递归地编写函数的主要内容,如果未能解决你的问题,请参考以下文章
如何编写递归函数javascript push我的数组属性Json对象?