2014-12-02 86 views
-1

我想在遞歸函數中用數值範圍填充數組,但我在返回數組時看到一個奇怪的事情,儘管數組有值,但當我在它未給出的函數外發出警告時它仍然存在。不確定它的代碼問題或任何類型的行爲。JavaScript中的遞歸函數來填充數組?

相同的實現時,我厭倦了使用簡單的循環它工作正常。

我不知道什麼標題給這個問題,請給我一個好的建議。

JS Fiddle

遞歸

var arr = []; 
function fillArray(n,i){ 
    if(arr.length !== n){ 
     if(i===0) 
      arr[i] = i; 
     else 
      arr[i] = arr[i-1] + 1; 
     fillArray(n,++i); 
    } 
    else{ 
     console.log(arr); 
     return arr; 
    } 
} 
console.log(fillArray(10,0)); 

隨着For循環

var arr = []; 

function fillArray(start,end){ 
    for(var i=start,j=0;i<=end;i++,j++){ 
     arr[j] = i; 
    } 
    return arr; 
} 

alert(fillArray(1,10)); 
+0

你有沒有試過用調試器調試它? – 2014-12-02 13:35:11

+0

回報我已經把console.log顯示其正確,但外部函數其未定義 – Duster 2014-12-02 13:36:55

+0

建議堆棧溢出,如果任何人或堆棧溢出投下的問題,請給出一個理由。這有助於下次人們提出問題。 – Duster 2014-12-02 13:39:16

回答

0

首先,這不是一件應該在JavaScript的遞歸來實現一個很好的例子。這是單一的。

該函數外部結果爲undefined的原因是您的代碼無法返回每個連續遞歸調用的結果。遞歸語句應該是這樣的:

return fillArray(n,++i); 

沒有這個,最後調用確實返回數組會簡單地由倒數第二呼叫忽略它的返回值。

+0

我在這裏使用遞歸是避免循環...是有任何方式來插入數組相同的值,如100 1沒有循環? – Duster 2014-12-03 11:55:47

+0

@Duster **爲什麼**你想避免循環? JavaScript沒有正確的尾部調用,所以像你的遞歸函數沒有很好的理由使用內存。循環沒有問題。 – Pointy 2014-12-03 15:22:54

+0

我實際上想要在單個循環中顯示一個範圍內的質數。所以我的複雜性不會是n * n。那麼有沒有辦法做到這一點? – Duster 2014-12-04 07:32:18

0

拿上你的例子看看:

var arr = []; 
function fillArray(n,i){ 
    if(arr.length !== n){ 
     if(i===0) 
      arr[i] = i; 
     else 
      arr[i] = arr[i-1] + 1; 
     fillArray(n,++i); // ends without returning anything 
    } 
    else{ 
     console.log(arr); 
     return arr; // return array 
    } 
} 
console.log(fillArray(10,0)); 

首先,我不會宣佈之外的功能價值,我也不會用做遞歸(因爲你污染你的閉合但是,如果你這樣做,你把你的功能,因爲它是,不要指望作爲返回此處(您編輯它的變量外)值。

var arr = []; 
function fillArray(n,i){ 
    if(arr.length !== n){ 
     if(i===0) 
      arr[i] = i; 
     else 
      arr[i] = arr[i-1] + 1; 
     fillArray(n,++i); 
    } // return not needed 
} 
fillArray(10,0); 
console.log(arr); 
1

function fillArray(n, i, a) { 
 
    a.push(i); 
 
    return a.length < n ? fillArray(n, ++i, a) : a; 
 
} 
 

 
console.log(fillArray(10, 0, []));