2016-02-19 104 views
-1

如何在不超出調用堆棧大小的情況下處理遞歸調用?硬幣算法優化

這個問題在這裏回答了Maximum call stack size exceeded error,但對我沒有幫助。這可能對別人有幫助。

算法提示是一點點漫長的,但對於那些你被確定:coin algorithm

我的代碼可能不會試圖滿足所有要求,但不管我想什麼,我有一些投入。

var gameSetup = { 
     coins: [2,333,4,11,99,20,10], 
     minOdds: 1, 
     maxOdds: 100000 
} 
function game(gs) { 
     this.minOdds = gs.minOdds; 
     this.maxOdds = gs.maxOdds; 

     var coinArray = gs.coins; 
     var coinArrayLength = coinArray.length; 
     var indicesToSplice = []; 

     var gameResults = { 
       turns: 0, 
       score: 0 
     } 

     var gameFunctions = { 
       getTurns: function() { 
         return gameResults.turns; 
       }, 
       setTurns: function() { 
         ++gameResults.turns; 
       }, 
       setScore: function(lcv,rcv) { 
         var score = lcv * rcv; 
         gameResults.score += score; 

       }, 
       getScore: function() { 
         return gameResults.score; 

       }, 
       generateFlips: function() { 
         return generateFlips.getRandomNumbersInclusive(); 
       } 

     } 
     var generateFlips = (function() { 
       var flips = []; 
         return { 
           getRandomNumbersInclusive: function() { 
             flips = []; 
             for(i=0; i < coinArrayLength; i ++){ 
               var currentFlip = Math.floor(Math.random() * (maxOdds - minOdds + 1)) + minOdds; 
               flips.splice(0,0,currentFlip); 
             } 
           return flips; 
           } 
         } 
     })(); 
     (function takeTurn(coinArrayLength) { 
       var flips = gameFunctions.generateFlips(); 


       flips.forEach(function(i, index) { 
         if(i == maxOdds) { 
           var leftOfIndex = flips[index-1]; 
           var rightOfIndex = flips[index +1]; 
           if(typeof leftOfIndex === 'undefined' || typeof rightOfIndex === 'undefined') { 

           } else { 
             indicesToSplice.splice(0,0,index); 
             var leftCoinValue = coinArray[index-1]; 
             var rightCoinValue = coinArray[index+1]; 
             gameFunctions.setScore(leftCoinValue,rightCoinValue); 
           } 

         } 

       }); 



       if(indicesToSplice.length > 0) { 
         indicesToSplice.forEach(function(i){ 
           coinArray.splice(i,1); 
           coinArrayLength = coinArray.length; 
         }); 
       } 
       indicesToSplice = []; 
       gameFunctions.setTurns(); 

       if(coinArrayLength > 2) { 
         takeTurn(coinArrayLength); 
       } else { 
         return; 

       } 

     })(coinArrayLength); 


} 
game(gameSetup); 
+3

你必須閱讀[問] – Amit

+0

如果代碼工作,這可能會更好的問在http://codereview.stackexchange.com/ – Andy

+0

@然後最大調用堆棧大小超過。節點拋出一個範圍錯誤。 –

回答

1

How do I handle the recursive call without exceeding the call stack size?

你不讓它遞歸。除了coinArrayLength之外,沒有需要保存的狀態,這可以通過while循環來完成。

while (coinArrayLength > 2) { 

    var flips = gameFunctions.generateFlips(); 

    flips.forEach(function(i, index) { 
     if(i === maxOdds) { 
      var leftOfIndex = flips[index-1]; 
      var rightOfIndex = flips[index +1]; 
      if(typeof leftOfIndex === 'undefined' || typeof rightOfIndex === 'undefined') { 


      } else { 
       indicesToSplice.splice(0,0,index); 
       var leftCoinValue = coinArray[index-1]; 
       var rightCoinValue = coinArray[index+1]; 
       gameFunctions.setScore(leftCoinValue,rightCoinValue); 
      } 
     } 
    }); 

    if(indicesToSplice.length > 0) { 
     indicesToSplice.forEach(function(i){ 
      coinArray.splice(i,1); 
      coinArrayLength = coinArray.length; 
     }); 
    } 
    indicesToSplice = []; 
    gameFunctions.setTurns(); 
} 

您的代碼充滿了沒有目的的IIF。該gameFunctions.generateFlips功能可以歸結爲:

function generateFlips() { 
    var flips = []; 
    for (var i = 0; i < coinArrayLength; i++) { 
     var currentFlip = Math.floor(Math.random() * (maxOdds - minOdds + 1)) + minOdds; 
     flips.unshift(currentFlip); 
    } 
    return flips; 
} 

然而,你必須將其與2條return語句,一個IIF內,存儲在gameFunctions對象上寫。把事情簡單化。

+0

你是一個聰明的人@cdbajorin和靈感。感謝您優化的代碼和需要考慮的評論。 –

+0

我試着對你的答案進行投票,但我需要首先建立一個堆棧聲望。一旦我做了,我將重新回顧積極的反饋:) –