0

こんにちは私は再帰を学ぼうとしている初心者です。arr に [4, 6, 23, 10, 1, 3] が含まれている場合、ArrayAdditionI(arr) に組み合わせアルゴリズムに関する関数を記述しようとしています。4 + 6 + 10 + 3 = 23 であるため、出力は true を返す必要があります。23 は配列内の最大数。どの組み合わせも 23 を与えない場合、関数は false を返します。

私のコードでは、 return を使用しようとしましたが、機能しませんでした。次に、それを変更して throw します。throw が機能する理由は理解していますが、return が機能しなかった理由は混乱しています。

動作しているjsのコードは次のとおりです。

function ArrayAdditionI(arr) { 

//remove the maximal number from arr

var m = arr[0];
for (var i=0; i<arr.length-1;i++)
m =  Number(arr[i]) > Number(arr[i+1]) ? arr[i]:arr[i+1];
arr.splice(arr.indexOf(m),arr.indexOf(m));

//Here the recursion starts:

var combiAdd = function (a){
  var sum = 0;   
  for (var j=0; j<a.length;j++){
    sum += a[j];
    if (sum == m)
      throw true;
    else if (sum != m && j==a.length-1){
      if (a.length == 1)
        throw false;//switch to the "return false;"
      else
        combiAdd(a.splice(1,a.length));//switch to "return combiAdd(a.splice(1,a.length));
    }
  }        
}    

try {
    combiAdd(arr);
  }
catch(exp){
if (exp !=true && exp!=false)
  throw exp;
else 
  return exp;}
}

動作していない return を含む私のコードは次のとおりです。

//...same code as above
    if (a.length == 1) //same code
      return false;
    else
      return combiAdd(a.splice(1,a.length));

[4, 7, 10, 1] のようなおそらく偽の配列に対して未定義のメッセージが表示されます

誰でも私を助けることができますか?ありがとうございました!

4

1 に答える 1

0

コードを簡素化できます。

function ArrayAdditionI(arr) {
    var sum = 0, max;

    // remove the biggest number
    // and put the max number in a variable
    max = arr.splice( arr.indexOf( Math.max.apply(null, arr) ), 1)[0];

    // add the remaining numbers
    sum = arr.reduce(function (a, b) { return a + b; });

    return sum === max;
}
于 2013-08-06T01:05:25.693 に答える