2011-01-11 127 views
2


我對JavaScript很陌生,不理解它的一些行爲。我想寫一本在Eloquent JavaScript書中發現的reduce函數的遞歸版本。這是我的代碼:JavaScript中的遞歸減少

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 

誰能解釋我w HY?

回答

6

在這種else塊,你必須

return rec_reduce(...) 
+0

THX很多!!我現在忘記了這個返回的事情,主要是因爲每一個thime我需要遞歸的東西,我在原型中的原型 - 沒有返回聲明;)再次! – trzewiczek 2011-01-11 11:18:21

2

另一種方式來做到這一點:

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