2016-01-29 67 views
1

我正在做一個簡單的遞歸節點來生成所有10個字符的字符串。 我在執行過程中發生內存泄漏。 代碼如下。 任何想法?節點javascript遞歸內存不足

我認爲它可能與console.log(word)行關聯。 沒有這條線,代碼似乎工作。 但是,如果將結果打印到屏幕上,我的最終目標是使用生成的單詞實現http請求。我試過沒有絲網印刷,它也會產生內存不足。

var char = [ 
    'a', 
    'b', 
    'c', 
    'd', 
    'e', 
    'f', 
    'g', 
    'h', 
    'i', 
    'j', 
    'k', 
    'l', 
    'm', 
    'n', 
    'o', 
    'p', 
    'q', 
    'r', 
    's', 
    't', 
    'u', 
    'v', 
    'w', 
    'x', 
    'y', 
    'z', 
    ' ', 
    '\'' 
]; 


function recurseWord(keyword){ 

    if (keyword.length >= 10){ 
     return null ; 
    } 
    else{ 
     for (var index = 0 ; index < char.length ; ++index){ 

      keyword = keyword + char [index]; 

      console.log (keyword); 

      recurseWord (keyword) ; 

      keyword = keyword.substring(0, keyword.length-1); 

     } 
    } 
    return null ; 
} 

var keyword = ""; 
recurseWord(keyword); 
+1

我的快速數學告訴我有296萬億個組合。你確定要爲每個人提供網絡請求嗎? –

+0

哼哼,這是相當多的;-)。我可能會限制爲幾個字符。另外,我想我會更新代碼以在請求結果爲負時停止遞歸。我的問題是一個普遍的問題,但據我所知;-) – Jeannot

+0

其實,需要多長時間來耗盡內存?我運行你的代碼,它似乎到目前爲止工作(與console.log)。另外,理論上它應該可以正常工作。你最多隻有10個示波器。什麼版本/操作系統的節點? – Goblinlord

回答

1

首先,您需要將遞歸調用移出for循環。否則,循環將永遠不會退出,因爲index將保持在0

function recurseWord(keyword){ 

     console.log (keyword); 
    if (keyword.length >= 10){ 
     return null ; 
    } 
    else{ 
     for (var index = 0 ; index < char.length ; index++){ 

      keyword = keyword + char [index]; 

      console.log ("index "+index); 

     } 
     keyword += recurseWord(keyword.substring(0, keyword.length-1)); 
    } 
    return null ; 
} 
+0

你是錯的不幸的。我想要生成10個字符的所有組合。你的算法只產生一個單一的26個字符的字符串此外,你的算法不適當地使用遞歸。事實上,你只是在做一個直接遇到停止條件的遞歸調用。 – Jeannot

+0

您的預期成果是什麼? ['abcdefghij','bcdefghijk','cdefghijkl',..] – unicorn2

+0

類似於:aaaaaaaaa,aaaaaaaaab,aaaaaaaaac,aaaaaaaad,... – Jeannot

0

至於爲什麼要運行內存我不能確切地說,但你可以試試這個代替。作爲一個說明,我沒有用盡內存(運行幾分鐘)。

注:這將鎖定您的計算機(400+萬億次操作)

var inputArr = "abcdefghijklmnopqrstuvwxyz ".split("").concat("\'"); 
 

 
function run(str) { 
 
    console.log(str); 
 
} 
 

 
function recurse(index, recursed) { 
 
    if (recursed === undefined) 
 
    recursed = ""; 
 
    if (recursed.length >= 10) 
 
    return; 
 

 
    for (var i = 0; i < index.length; i++) { 
 
    run(recursed + index[i]); 
 
    recurse(index, recursed + index[i]); 
 
    } 
 
} 
 

 
recurse(inputArr);

+0

好吧我猜我的代碼沒有錯,因爲我的代碼有同樣的錯誤。當我到達字符串「aaaaaaarfs」時,它會很快崩潰(這取決於執行情況:有時它會更快崩潰,有時會更慢)。 – Jeannot

+0

我沒有這個問題。目前,我正在運行v5.5.0 Windows x64版本。我讓它運行到aaaacaaaaa +並且沒有問題。 – Goblinlord

0

JEANNOT,你必須有足夠的有趣,你不能生成他們的方式。

對於10 = 141'167'095'653'376的操作(即〜五十億次操作),這是26的功率。即使使用C/C++(這是相當低和接近cpu級別),您也必須測量它,您應該只運行10億次以下的操作(通過2016年的CPU的強大功能)。