2017-06-01 1 views
2

バットをすぐにオフにする、これは宿題の問題ではありません。私は自由な時間に再帰問題を練習しています。私はまだコンセプトの周りに頭を抱えています。私はこの問題を解決するのに非常に近いですが、私はそれらを合計しているときに根の整数 'n'をスキップする方法を理解できません。ここでは、これまでのコードは次のとおりです。 再帰を使用して、指定された整数以下のすべての整数を合計する方法

var sumBelow = function (n) { 
    console.log(n); 
    // base case 
    if (n === 0) { 
     console.log('we hit the base case'); 
     return 0; 
    } 
    // initialize var to hold sum 
    if (!sum_sumBelow) var sum_sumBelow = 0; 
    // add numbers 
    sum_sumBelow = n + sumBelow(n - 1); 
    return sum_sumBelow; 
}; 

console.log('answer is', sumBelow(4)); 

私は呼ん

'sumBelowは、(4)' 私がしたいことは3 + 2 + 1ですが、私は現在、4 + 3 + 2 + 1を取得しています。

ルートパラメータをスキップするにはどうすればよいですか?

+1

"sumBelow(n-1)"を呼び出し、 "sumbelow(4)"を呼び出す別の関数 "sumbelow '(n)"があります。 – mimre

+1

あなたが求めているのではなく、 "initialize var" 'if'文は必要ありません。' sum_sumBelow'変数は再帰呼び出しでは実行されず、現在の呼び出しにのみ適用されます。その変数を完全に削除し、 'return n + sumBelow(n -1)'だけを返すことができます。 – nnnnnn

+0

@nnnnnnそれを指摘してくれてありがとう!それを心に留めておくだろう –

答えて

3

あなたはすべてを印刷していると仮定すると、正しく変えるだけで何が間違っている:

sum_sumBelow = n + sumBelow(n - 1); 

あなたの例では

sum_sumBelow = n - 1 + sumBelow(n - 1); 

に。 answer is 6はコンソールに出力されますか? 3 + 2 + 1あなたは欲しいですか?

N.B.これは決して最良の再帰的解決法ではありませんが、依然として1つです。ここで

は、三元を使用しています@RobGが提供するあなたの全体の機能と同等です:

function sumBelow(n) {return n? n-1 + sumBelow(n-1) : 0} 
2

最も簡単な解決策は、2つの別々の機能を次のようになります。

function sumUntil(n) { 
    return n<=0 ? 0 : n + sumUntil(n-1); 
} 
function sumBelow(n) { 
    return sumUntil(n-1); 
} 

しかし、あなたはまた、すべての数字を減少させることができました1つ:

function sumBelow(n) { 
    return n<=1 ? 0 : (n-1) + sumUntil(n-1); 
} 
// equivalent to 
function sumBelow(n) { 
    const m = n-1; 
    return m<=0 ? 0 : m + sumUntil(m); // make sure not to use m-1 for the recursive call 
} 
0

あなたのコードに少し変更がありますあなたのアイデア。

変更ライン

sum_sumBelow = n + sumBelow(n - 1); 

のみ最初の反復を考えると

sum_sumBelow = n + sumBelow(n - 1) - 1 ; 
0

に、あなたが見ることができるように、あなたはn個を追加している

sum_sumBelow = n + sumBelow(n - 1); 

を言っていますされています実際にnを1より小さくしたいと考えています。代わりに、代わりに、あなたは書くだろう

sum_sumBelow = n-1 + sumBelow(n - 1); 

その後、各反復で1を追加します。したがって、4 + 3 + 2 + 1の代わりに3 + 2 + 1 + 0が得られます。

ベースケースを0ではなくn === 1に変更して、ゼロですが、それは本当に重要ではありません。

1

Hey Angela次の整数からの再帰を開始することで、ルートをスキップできます。

var sumBelow = function (n) { 
    return sum(n - 1); 
}; 

function sum (n) { 
    if (n === 0) return 0; 
    return n + sum(n - 1); 
} 

再帰関数の考え方は、私たちが繰り返し提供する状態/パラメータだけで実行することです。したがって、再帰関数自体は、特に外部に伝えない限り、何をスキップするかを指定することはできません。私はdemoを作って試してみることができます。

関連する問題