题目
编写程序实现集合 { 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;
}
感想
我认为面试题不应该引导面试者去钻牛角尖,每个人都有自己的特点,我们要想办法去发现每个人的闪光点,不要象这种守株待兔的方式,认为不用循环你就应该能想到用递归!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。