爸爸们,救救孩子吧,面试题内心已经崩溃~

adventurer · 2019-03-21 17:37:15 · 1577 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2019-03-21 17:37:15 的主题,其中的信息可能已经有所发展或是发生改变。

如题: 请实现一个方法得到两数相加结果,可用以下两种调用方式: sum(2,3)输出5 sum(2)(3)输出5 sum(2)(3)(4) 输出9


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1577 次点击  
加入收藏 微博
19 回复  |  直到 2019-03-22 17:32:33
adventurer
adventurer · #1 · 6年之前

已经坐路边抽了半包烟了,惆怅,觉得自己什么都不会了

blov
blov · #2 · 6年之前

你确定没记错题?你说两种调用方式,却给出了 3 种~

gofromzero
gofromzero · #3 · 6年之前

返回函数?

adventurer
adventurer · #4 · 6年之前

没记错,面试官提示我闭包,函数原型应该是 func sum(x) 然后能以闭包方式调用比如 sum(x)(x)(x)(x)(x)(x)(x)(x)这样连续

adventurer
adventurer · #5 · 6年之前

在线等啊,亲们

polaris
polaris · #6 · 6年之前

确认第1个是 sum(2,3)?如果第1个是 sum(2) 这样的,我有答案

adventurer
adventurer · #7 · 6年之前

对的,这个题我决不可能记错

adventurer
adventurer · #8 · 6年之前
function sum(){
    var num = arguments[0];
    if(arguments.length==1){
        return function(sec){
            return num+sec;
        }
    }else{
        var num = 0;
        for(var i = 0;i < arguments.length;i++){
            num = num + arguments[i];
        }
    return num;
    }
}

sum(2)(3)

5

sum(2,3)

5

我找到一个JavaScript实现方式,面试官说这在很多语言都是合法的调用形式。面试题也是golang的面试题,该不会是面试官没弄清楚吧

adventurer
adventurer · #9 · 6年之前
polarispolaris #6 回复

确认第1个是 sum(2,3)?如果第1个是 sum(2) 这样的,我有答案

贴上来参考参考,这步过不去我怕是不写代码了

polaris
polaris · #10 · 6年之前

我在星球给了答案,这里也贴一下。

package main

import "fmt"

func main() {
    Sum(2, 3)
    fmt.Println(total)
    Sum(2)(3)
    fmt.Println(total)
    Sum(2)(3)(4)
    fmt.Println(total)
    Sum(2)(3)(4)(5)
    fmt.Println(total)
    Sum(2)(3)(4)(5)(6)
    fmt.Println(total)

}

type myFunc func(int) myFunc

var total int

func Sum(nums ...int) myFunc {
    total = 0

    for _, num := range nums {
        total += num
    }

    var f1 myFunc
    f1 = func(a int) myFunc {
        total += a
        return f1
    }

    return f1
}

https://play.studygolang.com/p/mWp_zGyCLN9

adventurer
adventurer · #11 · 6年之前
polarispolaris #10 回复

我在星球给了答案,这里也贴一下。 ```go package main import "fmt" func main() { Sum(2, 3) fmt.Println(total) Sum(2)(3) fmt.Println(total) Sum(2)(3)(4) fmt.Println(total) Sum(2)(3)(4)(5) fmt.Println(total) Sum(2)(3)(4)(5)(6) fmt.Println(total) } type myFunc func(int) myFunc var total int func Sum(nums ...int) myFunc { total = 0 for _, num := range nums { total += num } var f1 myFunc f1 = func(a int) myFunc { total += a return f1 } return f1 } ``` https://play.studygolang.com/p/mWp_zGyCLN9

太感谢了,已哭~

polaris
polaris · #12 · 6年之前

还有网友给了一种更有好的方式,支持更复杂的:

package main

import (
    "fmt"
    "strconv"
)

var total int

type SumFunc func(...int) SumFunc

func (s SumFunc) String() string {
    tmpTotal := total
    total = 0
    return strconv.Itoa(tmpTotal)
}

func main() {

    var sum SumFunc

    sum = func(nums ...int) SumFunc {
        for _, num := range nums {
            total += num
        }

        return sum
    }

    fmt.Println(sum(2, 3))
    fmt.Println(sum(2)(3))
    fmt.Println(sum(2)(3)(4))
    fmt.Println(sum(2)(3)(4,5))
}

https://play.studygolang.com/p/KHD2SzdcPDU

adventurer
adventurer · #13 · 6年之前
polarispolaris #12 回复

还有网友给了一种更有好的方式,支持更复杂的: ```go package main import ( "fmt" "strconv" ) var total int type SumFunc func(...int) SumFunc func (s SumFunc) String() string { tmpTotal := total total = 0 return strconv.Itoa(tmpTotal) } func main() { var sum SumFunc sum = func(nums ...int) SumFunc { for _, num := range nums { total += num } return sum } fmt.Println(sum(2, 3)) fmt.Println(sum(2)(3)) fmt.Println(sum(2)(3)(4)) fmt.Println(sum(2)(3)(4,5)) } ``` https://play.studygolang.com/p/KHD2SzdcPDU

星球是什么社区啊,我也去那边看看

polaris
polaris · #14 · 6年之前
sakuraovq
sakuraovq · #15 · 6年之前

哈哈这个 题 不错

adventurer
adventurer · #16 · 6年之前
package fuck;

class main {
    public static void main(String[] args) {
        Sum sum = new Sum();
        sum.Sum(2, 3).Sum(2).Sum(2, 3);
    }
}

class Sum {
    public int total;

    public Sum Sum(int... x) {
        // Sum x = new Sum(x);
        for (int v : x) {
            this.total += v;

        }
        System.out.println(this.total);
        return this;
    }
}

贴个java版本吧,味道好像不太一样

adventurer
adventurer · #17 · 6年之前
编辑 预览 ```php <?php $a=0; $s = function($v) use (&$a){ $a+=$v; }; $sum = function (...$nums) use ($s,&$sum){ foreach ($nums as $v) { $s($v); } return $sum; }; $sum(3,4)(3)(4)(3,1); echo $a; ``` 提交 取消
adventurer · #18 · 6年之前 最后说一下,闭包的关键点其实是“闭包函数的运行方向是由外向内的” 编辑 预览 ```php <?php $a=0; $s = function($v) use (&$a){ $a+=$v; }; $sum = function (...$nums) use ($s,&$sum){ foreach ($nums as $v) { $s($v); } return $sum; }; $sum(3,4)(3)(4)(3,1); echo $a; ``` 最后说一下,闭包的关键点其实是“闭包函数的运行方向是由外向内的” 提交 取消 chengruo · #19 · 6年之前 妙啊 编辑 预览 妙啊 提交 取消
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传