2016-10-05 1 views
3

階乗を計算するためのこのコードで、ステップが-1でなく-1であるのはなぜですか? n = 0と計算する方法は、プログラム内にnが0,、n> 0の場合のみです。なぜこの階級コード(再帰なし)では、ステップは+1ではなく-1ですか?

def factorial(n) 
    if n < 0 
    return nil 
    end 

    result = 1 
    while n > 0 
    result = result * n 

    n -= 1 
    end 

    return result 
end 
+0

'4! = 4 * 3 * 2 * 'または' 2 * 3 * 4'である。このコードの作成者は '4'(引数' n')から始まり、作業を中止することに決めました。 –

+0

(コードコメントなしでは、なぜ結果が 'n'に初期化されていないのか、' n'をデクリメントし、 '1 greybeard

答えて

4

resultがデフォルトで1に設定されているので、それはn=0を計算します。 n0の場合、ループは実行されません(n> 0ではないため)。resultのデフォルト値(1)が返されます。

それは、すべての数字の上に下向きそう

5を数えることができるようにそれは1時間ごとに減算! = 5×4×3×2×1

それは

5あろう一つずつ時間を追加した場合! = 5 * 6 * 7 * 8 ...

などとなる。それは間違っているだけでなく、無限ループになります。

+0

どうすれば0です!あなたのコードでは1に設定されていますが、なぜ0ですか?とにかく1に等しい? –

+0

@ sagarpandya82これは、階乗関数が数学でどのように定義されるかです。 https://en.wikipedia.org/wiki/Factorial#Definition –

+0

@ sagarpandya82実際には面白い質問ですが、答えはわかりません。私は数学者がそれをそのように定義することを決めたことを知っています、なぜか分かりません。 – nhouser9

3

ステップが-1であるため、n *(n-1)*(n-2)* ... * 1の値をすべて掛け合わせることができます。乗算はnから始まり、ステップは否定的である。 (が1から始まりnまで上がることができます。その場合は、ステップが+1になるようにしてください)。

このプログラムは、 0は、whileループの前にデフォルトがresult = 1に設定されているためです。その場合、ループの本体はスキップされます。

1

whileループがwhile n > 0になるため、ステップが-1で+1ではない理由はです。したがって、n += 1を実行する場合は、無限ループを手にすることになります。

イテレータを使用してforループを設定する場合は、イテレータを開始してiterator <= nに移動します。その場合は、iterator += 1とします。しかし、このような状況では、1-nのすべての値を掛けるだけで済みます。これは順序には敏感ではありません。そのため、nで始まり、ゼロに達するまで減らすのは簡単でコードが少なくなります。それがn -= 1の理由です。

2

1 * 2 * 3 == 3 * 2 * 1のように、あなたはあなたの道を上っているか下っていても問題はありません。ただし、引数nをデクリメントすると、nに達するまでインクリメントされる追加の別の変数に基づいて計算するのではなく、resultの計算に直接使用できます。

しかし、まだルビー的なやり方ではありません。また、あなたの実装が1としてfactorial(0)計算方法を尋ね

def factorial(n) 
    n == 0 ? 1 : (1..n).inject(:*) 
end 

:私はおそらくのようなものでいいと思います。n == 0while n > 0ループがアクティブにならない場合は、result = 1の初期設定からreturnステートメントにスキップします。

関連する問題