英文:
Could golang implement this interview question of getting array summary without for/while if/else?
问题
我正在研究一个有趣的面试问题,并尝试用Go语言实现它。
(1) 输入一个整数,比如
i
(2) 计算
1+2+...+i
的总和,并输出结果
(3) 要求:不使用乘法,不使用循环(
for/while
),也不使用if/else
语句
在C++或Java中,这个问题很容易解决。我们可以使用静态变量初始化一个对象数组,而对象的构造函数计算这个总和。像这样:
#include <iostream>
struct s {
static int count;
static int sum;
s() {++count; sum += count;}
};
int s::count = 0;
int s::sum = 0;
int main(int argc, char *argv[]) {
s obj[10];
std::cout << s::sum << std::endl; // 55, ok
return 0;
}
在C++中,我们还可以使用模板类型推导来实现。互联网上有很多示例。
但是,我们能用Go语言实现这个吗?
我知道Go语言既没有构造函数,也不支持静态变量。它也没有任何模板语法。此外,使用递归函数仍然需要在代码中使用if
分支。
所以,在Go语言中能否做到同样的事情呢?(不使用for循环,不使用if else)。谢谢。
英文:
I'm looking into an interesting interview question, and try to implement it with go.
> (1) Input an integer number, say i
> (2) Calculate the summary of 1+2+...+i
, output the summary
> (3) Requirement: don't use multiply, don't use loop(for/while
), and don't use if/else
Well, in c++ or java this is pretty easy. We can use static variable to initialize an object array, while the objects's constructor function calculate this summary. Like this:
#include <iostream>
struct s {
static int count;
static int sum;
s() {++count; sum += count;}
};
int s::count = 0;
int s::sum = 0;
int main(int argc, char *argv[]) {
s obj[10];
std::cout << s::sum << std::endl; // 55, ok
return 0;
}
(2) in c++ we could also use template type deduction to do this. Plenty samples on the internet.
But, can we achieve this with go language?
I know that golang has neither constructor function, nor it supports static variable. And it doesn't have any template syntax. Plus, using recursive function still requires if
branches in the code.
So is this possible to do same thing in go? (no for loop, no if else). Thanks.
答案1
得分: 1
这是一个语言中立的解决方案,不使用乘法、for循环和if语句。
这种解决方案有点像递归解决方案,其中if语句被替换为一个函数映射,该映射具有true和false分支的函数:
fs := map[bool]func(int) int{}
fs[false] = func(int) int { return 0 }
fs[true] = func(i int) int { return i + fs[i > 1](i-1) }
var i int
fmt.Scanln(&i)
fmt.Println("sum:", fs[i > 0](i))
输入10
,输出结果为(在Go Playground上尝试):
sum: 55
英文:
Here's a language-neutral solution that uses no multiplication, no for
and no if
.
It's kind of like a recursive solution, where the if
is substituted with a function map, having functions for the true
and false
branches:
fs := map[bool]func(int) int{}
fs[false] = func(int) int { return 0 }
fs[true] = func(i int) int { return i + fs[i > 1](i-1) }
var i int
fmt.Scanln(&i)
fmt.Println("sum:", fs[i > 0](i))
Inputting 10
, the output is (try it on the Go Playground):
sum: 55
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论