【经典面试题】数组求和。不能用循环,不能用标准库函数!
今天偶然看到这么一道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,再运行下

正确。
题目完成。
浙公网安备 33010602011771号