2017-05-21 11 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

귀하의 솔루션은 합리적이다. 다른 버전에서는 하나의 중간 값을 상태로 유지하기 만하면됩니다 (재귀 버전의 마무리 호출 최적화 가정). 반면 알고리즘은 길이가 n 인 배열을 사용합니다. 이것을 피하기 위해 목록 대신 생성기를 사용할 수 있습니다.

+0

꼬리 전화? - 계승 (n - 1)을 말하는 겁니까? 함수 안에서 호출되면? 나는 그것을 얻지 못한다. 나는 JS를 배우려고 노력했지만 여전히 프로그래머의 이런 식으로 문제에 접근 할 수 없다. – crg821

+0

이것은 자바 스크립트에만 적용되는 것은 아닙니다. Naive 재귀 구현은 호출 당 메모리 비용을 부과합니다.이 비용은 tail-recursion이라는 최적화로 피할 수 있습니다. 이것은 재귀 호출이 위의 재귀 적 정의의 경우 인 함수의 마지막 명령문이어야합니다. – nucleon