微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 使用动态参数递归

参见英文答案 > Variadic curried sum function11个
这是一个我尚未弄清楚的面试问题.考虑以下:
function recurse(a) {
    return function(b) {
        console.log(a + b);
    }
}

//This will log '5' in the console
recurse(2)(3);

现在我被要求编写一个函数,它将获取n个参数,并通过记录参数值的最终总和以相同的方式工作.含义:

//This should log '13'
recurse(2)(3)(1)(7)

如何编写这样的函数?我已经尝试过在递归,动态参数等方面进行思考.但是还没有能够记下任何具体的东西.

解决方法

这是我能想到的最简单的版本:
function add (a) {
  return function (b) {
    return b == null ? a : add(a+b);
  }
}

console.log( 
  add(2)(3)() 
);
console.log(
  add(10)(100)(1000)(4)() 
);

在es6中,它很紧凑!

let add = a => b => b == null ? a : add(a+b);

注意

你的问题的问题是函数可以返回一个函数一个数字.以下代码

let result = add(2)(3);

相当于:

/*1*/ let partialResult = add(2);
/*2*/ let result = partialResult(3);

在第1行中,add不知道是否使用最后一个参数调用它!换句话说,它不知道partialResult应该是一个数字,还是一个将用另一个参数调用函数.

Nina Scholz为您提供了一个解决方案,其中partialResult在处理时像primitive一样表现得像一个数字,就像函数一样被调用时.在我的解决方案中,partialResult总是像一个函数一样,并在没有参数的情况下调用时返回一个sum.

第一种方法需要一种特定于语言的机制,以便在某些条件下“表现得像一个数字”.如果您的采访是关于JavaScript的,那么这是最好的近似值!但在语言不可知的背景下,你所要求的是不可能的.

原文地址:https://www.jb51.cc/js/150441.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐