반복 버전이 더 오래 걸리는 이유는 무엇입니까?


11

나는 http://programming.lispdream.com/blog/2011/06/recursion-vs-iteration/ 을 살펴 보았고 그의 계승 함수의 재귀적이고 반복적 인 구현의 구현에서 반복이 실제로 더 오래 걸리는 것을 보았습니다. 주어진 n = 1,000. 나는 이유를 알 수 없다 (그는 설명하지는 않지만 독자를위한 운동이라고 말합니다). 이 모든 것에 대해 새로움을 드려 죄송합니다.

답변:


10

두 프로그램은 동일하지 않습니다. 재귀 버전은 컴퓨팅입니다

(... ((1 * 2) * 3) * 4 ... * n)

반복적 인 것은 컴퓨팅하는 동안

(... ((n * (n-1)) * (n-2) ... * 1)

따라서 반복 버전의 경우 중간 수량이 더 빠르게 증가하고 관련 숫자가 적을 때 큰 숫자 계산이 더 빠릅니다 (큰 숫자가없는 1000! 계산은 의미가 없으며 리스프 (lipip) 스위치가 큰 숫자로 자동 전환됩니다).


1

재귀 알고리즘을 반복적으로 만들 때는 결과를 추적하는 스택을 명시 적으로 구현해야합니다. 이 행위는 재귀 알고리즘이 무료로 얻는 스택을 밀고 터지는 것을 다루는 추가 작업을 추가합니다 (무료는 아니지만 추가 작업은 재귀 비용보다 더 많이 합쳐집니다).


1
프로그램을 보았습니까? 반복 계승은 스택을 전혀 조작하지 않습니다.
AProgrammer

-1

그 벤치 마크가 C 또는 SBLC 코드에서 온 것인지 확실하지 않습니다. 내 생각에 범인은 변수를 변경하고 있습니다. 1000! 꽤 큰 숫자 일 수 있습니다. 아마도 복사본을 만들고 덮어 쓰는 것보다 스택을 채우고 정리하는 것이 더 빠릅니다.


그것들은 SBCL 코드에서 나온 것이라고 생각합니다.
martinjacobd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.