2013-11-14 56 views
3

我受到this question的啓發,在JavaScript中編寫遞歸函數以添加數組的元素並相應返回數組。在JavaScript中返回數組

在僞

arr = [1,2,3,4,5,6] 
func (arr,2) = > [1+3+5, 2+4+6] 
       [9,12] 
func (arr,3) = > [1+4,2+5,3+6] 
       [5,7,9] 

所以我寫了一個小提琴,here

var input = [1,2,3,4,5,6,7,8,9]; 

function tupleAdd(tuple,i,p,t,output){ 
    if(typeof t == "undefined") 
     t=0; 
    if(typeof p == "undefined") 
     p=0; 
    if(typeof output == "undefined") 
     output = []; 
    if(typeof output[t] =="undefined") 
     output[t]=0; 

    output[t]+=i[p]; 
    p++; 
    t++; 
    t>=tuple?t=0:null; 
    if(p<i.length) 
     tupleAdd(tuple,i,p,t,output); 
    else{ 
     console.log(output); 
     return(output); 
    } 
} 

x = tupleAdd(3,input); 
console.log(x); 

我的功能起作用,因爲第一個console.log()顯示了合適的值。奇怪的是,當我returnoutput(有或沒有parens),並嘗試再次記錄它,我得到undefined

我覺得這讓人深感不安。誰能澄清爲什麼return值與console.log值不同?

+3

如果遞歸調用前加'return'會發生什麼'tupleAdd()'? – BenM

+1

如何做'返回tupleAdd(元組,i,p,t,輸出)'? – PSL

回答

2

您需要返回遞歸調用的值:

var input = [1,2,3,4,5,6,7,8,9]; 

function tupleAdd(tuple,i,p,t,output){ 
    if(typeof t == "undefined") 
     t=0; 
    if(typeof p == "undefined") 
     p=0; 
    if(typeof output == "undefined") 
     output = []; 
    if(typeof output[t] =="undefined") 
     output[t]=0; 

    output[t]+=i[p]; 
    p++; 
    t++; 
    t>=tuple?t=0:null; 
    if(p<i.length) 
     return tupleAdd(tuple,i,p,t,output); 
    else{ 
     console.log(output); 
     return(output); 
    } 
} 

x = tupleAdd(3,input); 
console.log(x); 
3

您的遞歸被打破。你沒有定義函數,因爲你沒有函數調用返回。

tupleAdd(tuple,i,p,t,output); 

需求是

return tupleAdd(tuple,i,p,t,output); 
+0

謝謝! Upvoted你和Ben。我剛剛接受他,因爲他第一次發表評論。我沒有一個更好的標準,因爲這兩個答案同樣有幫助,幾乎同時出現。 –

-2
function doTuple(arr, tuple){ 

    if(!arr.length){ 
     return tuple; 
    } 

    var el = arr.splice(0,1); 

    el % 2 ? tuple.evens += +el : tuple.ods += +el; 

    return doTuple(arr, tuple); 
} 

console.log(doTuple([1,2,3,4,5], {evens:0,ods:0}));