题目

编写程序实现集合 { 5,1,8,3,7,2,6 } 的求和,要求:不允许用循环。

问题由来

被作为『砖家』请去为一家公司把关面试题,这是一个他们比较得意的题目,我一看惊住了,咱也不会,呵呵!
他们是想让面试者用递归来解这个问题,而我认为如果他们的目的是这样的话,这题没有任何意义。但若从考查发散思维的角度来看这个问题的话,让面试者想尽可能多的解决方法来解决它,到是一个不错的选择。

解法一(递归)

公司官方解法,比较容易,这就不列出源代码了。

解法二(动态语言的函数式编程)

这是我的第一反应,因为不限语言,动态语言太有优势了,但如果较真的话,其实语言底层还是用循环实现的,呵呵!
下面是用javascript实现的解法:

[5,1,8,3,7,2,6].reduce(function(x,y){return x+y;});

解法三(对象初始化)

这是我能想到的完全符合题意,比较『变态』的一个解法。
下面是用C++实现的解法:

#include "stdafx.h"

class MySum
{
public:
    MySum(int n) { N=n; Sum += N; }

    static void Reset() { N = 0; Sum = 0; }
    static int GetSum() { return Sum; }

private:
    static int N;
    static int Sum;
};

int MySum::N = 0;
int MySum::Sum = 0;

int My_Sum()
{
    MySum::Reset();

    MySum a1 = MySum(5);
    a1 = MySum(1);
    a1 = MySum(8);
    a1 = MySum(3);
    a1 = MySum(7);
    a1 = MySum(2);
    a1 = MySum(6);

    return MySum::GetSum();
}

int _tmain(int argc, _TCHAR* argv[])
{
    printf("%d", My_Sum());
    getchar();
    return 0;
}

感想

我认为面试题不应该引导面试者去钻牛角尖,每个人都有自己的特点,我们要想办法去发现每个人的闪光点,不要象这种守株待兔的方式,认为不用循环你就应该能想到用递归!


zhoutk
2.6k 声望1.2k 粉丝

自由程序员,技术路线c,delphi,c++,c#,java,php,node.js,python,golang,typescript;超喜欢react.js的设计思路,全栈开发成为我的终极目标。开发机器macbook pro,或装ubuntu、fedora的机器,编程用vim...