2017-05-21 15 views
0

JavaScriptを学んでいますが、私はFactorialsのこのソリューションを考え出しました。私はいくつかのフィードバックを得たいと思います。 これは効率的でしょうか? JavaScriptを使用したファクタリール

function factorialize(num) { 
var total= []; 
    if(num!==0){ 
    for(var i=1; i<=num; i++){ 
     total.push(i); 
    } 
    var newTotal = total.reduce(function(a,b){ 
     return a*b; 
    }); 
    return newTotal; 
    }else { 
    return 1; 
    } 
} 
console.log(factorialize(6)); 

私はオンラインで見つける読み、理解しやすいです。この他の方法で、私は単にこの方法を考えることはできません。

非再帰的に再帰的に

var factorial = function(n) { 
if(n == 0) { 
    return 1 
} else { 
    product = 1; 
    for(i = 1; i <= n; i++) { 
     product *= i; 
    } 
    return product; 
    } 
} 
console.log(factorial(num)); 

:それについて批判することができるもの、それはメモリと少し無駄であるということですが、

var factorial = function(n) { 
if(n == 0) { 
    return 1 
} else { 
    return n * factorial(n - 1); 
} 
} 
console.log(factorial(num)); 
+0

"私はいくつかのフィードバックを得たい"このサイトではあまりにも曖昧です。特に懸念がある場合は、教えてください。そうでない場合は、[コードレビューサイト](https://codereview.stackexchange.com/)でこの質問をしてください。 –

+0

最初の方法は面白いです。数値を配列に入れてからarray.reduceメソッドを使います。単純に乗算するより効率が悪くなります。主に配列のアクセスが必要なためです。再帰的メソッドは多くの関数呼び出しを必要とするため、単純なループよりも効率が悪いです。すべてのメソッドはプログラミングの概念を導入するのに便利ですが、最も実用的ではありません。 –

+0

また、最初は配列を使ってリソースを無駄にしていると思います。私はちょうど再帰的または非再帰的な解決策のような単純なアプローチを持っていないようです。バマー! – crg821

答えて

1

あなたのソリューションは、合理的です。他のバージョンでは、1つの中間値を状態として保持する必要があります(再帰バージョンのテールコール最適化を前提としています)が、アルゴリズムは長さnの配列に依存します。これを避けるためにリストの代わりにジェネレータを使うことができます。

+0

テールコール? - 階乗(n - 1)を指していますか?関数内で呼び出されたとき?私はそれを取得しません。私はJSを学ぼうとしていますが、プログラマのような問題にはまだアプローチできません。 – crg821

+0

これはjavascriptにのみ適用されるものではありません。純粋な再帰実装では、呼び出しごとにメモリコストがかかります。これは、tail-recursionという最適化によって回避できます。これには、再帰呼び出しが関数の最後のステートメントになる必要があります。これは上記の再帰的定義の場合です。 – nucleon

関連する問題