2016-11-08 4 views
0

FreeCodeCamp's Advanced Algorithm: No Repeats challengeのための私のソリューションをチェックアウト:FreeCodeCampチャレンジ:エラーメッセージを説明しますか?

Return the number of total permutations of the provided string that don't have repeated consecutive letters.

右のコードがを返す必要があります。誰かが私にこれらのエラーメッセージを説明できますか?

RangeError: Maximum call stack size exceeded
at findFactorial:14:24
at findFactorial:21:14
at findFactorial:21:14
at findFactorial:21:14
at findFactorial:21:14
at findFactorial:21:14

注:エラーがあり、正確な行番号を取得するには、コピー&ここにコードを貼り付けます:https://repl.it/

function permAlone(str) { 
     var final, factorial, repeated, i; 
     repeated = str.match(/([a-z])(?:.*)(\1)+/g); 
     if (str.length < 2) { 
      return 1; 
     } 

     // should return ["aa", "ff"] 
     if (repeated[0] === str) { 
      repeated[0] = repeated[0].split('').sort().join('').match(/([a-z])(?:.*)(\1)+/g); 
      repeated = repeated.reduce(function(a, b) { 
       return a.concat(b); 
      }); 
     } 

     function findFactorial(n) { 
      if (n < 0) { 
       alert("No negative numbers accepted."); 
      } 
      if (n === 0) { 
       return 1; 
      } 
      return n * findFactorial(n - 1); 
     } 

     factorial = findFactorial(str.length); // 7! = 5040 

     for (i = 0; i < repeated.length; i++) { 
      i++; 
      if (repeated.length === 1 && repeated.join("") !== str) { 
       final = factorial - findFactorial((str.length - 1)) * findFactorial(repeated[0].length); 
      } else if (repeated.length > 1 && repeated[i-1].length>2 || repeated[i].length>2) { 
       final = findFactorial(repeated[i].length) * findFactorial(repeated[i - 1].length); 
      } else { 
       final = factorial - ((findFactorial((str.length - 1) * repeated[i].length) * (findFactorial(str.length - 1) * repeated[i - 1].length))) + (findFactorial(str.length - 2) * findFactorial(repeated[i - 1]) * findFactorial(repeated[i])); 
       // final = 5040 - ((6! * 2!)*2) + (5! * 2! * 2!); 
      } 
     } 
     return final; 
    } 
    permAlone('abfdefa'); // should return 2640 
+1

これは、無限ループ中に発生します。再帰をチェックして、必要なときに終了していることを確認してください。 –

答えて

1

をtibsarは正しい方向にあなたと私を指摘しました。渡された "aa"または "ff" findFactorialはスタックが吹くまで自身を呼び出し続けます。あなたは負の入力のチェック(非整数入力のチェック)を超えてfindFactorialに防弾を追加することができます。

   final = factorial - ((findFactorial((str.length - 1) * repeated[i].length) * (findFactorial(str.length - 1) * repeated[i - 1].length))) + (findFactorial(str.length - 2) * findFactorial(repeated[i - 1]) * findFactorial(repeated[i])); 

[あなたが.LENGTH二度忘れてしまった、あなたが悪い部分や内容を変更する必要がありますを参照するには右にスクロールする必要があります]それは、

次のようになります。しかし一方で、私はあなたのコードに問題のある行を見つけました
   final = factorial - ((findFactorial((str.length - 1) * repeated[i].length) * (findFactorial(str.length - 1) * repeated[i - 1].length))) + (findFactorial(str.length - 2) * findFactorial(repeated[i - 1].length) * findFactorial(repeated[i].length)); 

このように、チャレンジに対する正解はないようですが、質問したエラーは解決します。

+0

ありがとう、それを解決! – veron