JavaScript 中的递归归约

发布于 2024-10-11 09:25:22 字数 625 浏览 7 评论 0原文


我对 JavaScript 很陌生,不理解它的一些行为。我想编写 Eloquent JavaScript 书中找到的 reduce 函数的递归版本。这是我的代码:

function rec_reduce( fn, base, list ) {
    if( list.length === 0 ) {
        return base;
    }
    else {
        rec_reduce( fn, fn( base, list[ 0 ] ), list.slice( 1 ) );
    }
}
print( rec_reduce( Math.min, 100, [ 5, 3, 7, 2, 6, 5 ] ));

结果是:

undefined

为了看看发生了什么,我把:

print( base );

作为函数的第一行,结果是:

100
5
3
3
2
2
2
undefined

谁能解释一下为什么?

I'm quite new to JavaScript and don't understand a few of its behaviours. I want to write a recursive version of reduce function found in Eloquent JavaScript book. That's my code:

function rec_reduce( fn, base, list ) {
    if( list.length === 0 ) {
        return base;
    }
    else {
        rec_reduce( fn, fn( base, list[ 0 ] ), list.slice( 1 ) );
    }
}
print( rec_reduce( Math.min, 100, [ 5, 3, 7, 2, 6, 5 ] ));

The result was:

undefined

To see what's going on I put:

print( base );

as a first line of the function and the result was:

100
5
3
3
2
2
2
undefined

Whould anyone explain me why?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

娇纵 2024-10-18 09:25:22

在那个 else 块中,您必须

return rec_reduce( ... )

In that else block, you'll have to

return rec_reduce( ... )
冷了相思 2024-10-18 09:25:22

另一种方法是:

reduce_file.js:

function reduce(arr, func, initv){
      if(arr.length) return reduce(arr.slice(1), func, func(initv, arr[0]))
      else return initv
}
module.exports = reduce

,然后将其用作:

reduce = require('./reduce_file.js')
console.log(reduce([1,2,3,4], function(prev, curr) {
  return prev + curr
}, 0))

结果:

10 

来自 1+2+3+4=10

Another way to do it:

reduce_file.js:

function reduce(arr, func, initv){
      if(arr.length) return reduce(arr.slice(1), func, func(initv, arr[0]))
      else return initv
}
module.exports = reduce

and then you use it as:

reduce = require('./reduce_file.js')
console.log(reduce([1,2,3,4], function(prev, curr) {
  return prev + curr
}, 0))

result:

10 

from 1+2+3+4=10

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文