【经典面试题】数组求和。不能用循环,不能用标准库函数!

今天偶然看到这么一道Web前端面试题,挺有意思的。

 

要求:①对任意给定数组求和;

           ②不能使用循环;

           ③不能使用标准库函数。

 

据说这是字节的面试题,一看确实没什么头绪,这个题需要对算法熟练掌握。

以数组$num\ =\ [2,\ 5,\ 7,\ 9,\ 10,\ 35,\ 6,\ 9,\ 7,\ 0,\ 31,\ 98,\ 55]$为例。首先,我们先定义一个函数$f(i)$,是从第个元素开始一直到最后一个元素的和,例如

$f\left(2\right)=\ 7+9+10+\ldots+55$

$f\left(3\right)=\ 9+10+35+\ldots+55$

这么一来$f(0)$就是整个数组的和。

下面我们再来思考一个问题:$f(i)$与$f\left(i+1\right)$的关系是怎样的。

通过上面的例子我们可以了解到:

$f\left(2\right)-f\left(3\right)=7=num[2]$

也就是说:

 $f\left(i\right)=f\left(i+1\right)+num[i]$

至此,我们就得到了$f(i)$与$f(i+1)$的关系,但是我们也发现了一个漏洞:大于数组的最大下标怎么办?或者说,数组为空怎么办。显然,此时:

 $f\left(i\right)=0$

至此我们得到了的分段函数形式:

\begin{equation}
f(i)=
\begin{cases}
f\left(i+1\right)+num[i],& i\le num.length\\
0,& i> num.length
\end{cases}
\end{equation}

据此,我们写出代码:

 1 var num_data = [2, 5, 8, 9, 10, 35, 6, 9, 7, 0, 31, 98, 55];
 2 
 3 function calSum(num) {
 4     function f(i) {
 5         return i >= num.length ? 0 : num[i] + f(i + 1);
 6     }
 7     return f(0);
 8 }
 9 
10 console.log(calSum(num_data));

这其实是一个递归算法,运行一下

 正确。我们让$num=[]$,此时结果应为0,再运行下

 正确。

题目完成。

posted @ 2022-06-20 00:11  su_rm-rf/*  阅读(122)  评论(0)    收藏  举报