TL; DR : 기능적 언어는 비 기능적 언어보다 재귀를 더 잘 처리합니까?
저는 현재 Code Complete 2를 읽고 있습니다.이 책의 어느 시점에서 저자는 재귀에 대해 경고합니다. 그는 가능하면 피해야하며 재귀를 사용하는 함수는 일반적으로 루프를 사용하는 솔루션보다 덜 효과적이라고 말합니다. 예를 들어, 저자는 숫자의 계승을 계산하기 위해 재귀를 사용하여 Java 함수를 작성했습니다 (현재 나와 함께 책이 없기 때문에 정확히 같지 않을 수도 있음).
public int factorial(int x) {
if (x <= 0)
return 1;
else
return x * factorial(x - 1);
}
이것은 나쁜 해결책으로 제시됩니다. 그러나 기능적 언어에서는 재귀를 사용하는 것이 선호되는 방식입니다. 예를 들어, 재귀를 사용하는 Haskell의 계승 함수는 다음과 같습니다.
factorial :: Integer -> Integer
factorial 0 = 1
factorial n = n * factorial (n - 1)
그리고 좋은 해결책으로 널리 받아 들여지고 있습니다. 내가 본 것처럼, Haskell은 재귀를 매우 자주 사용하며, 눈살을 찌푸리는 곳은 보지 못했습니다.
그래서 내 질문은 기본적으로 :
- 기능적 언어는 비 기능적 언어보다 재귀를 더 잘 처리합니까?
편집 : 내가 사용한 예제가 내 질문을 설명하기에 최선이 아니라는 것을 알고 있습니다. 방금 Haskell (및 기능적 언어)이 비 기능적 언어보다 훨씬 자주 재귀를 사용한다는 것을 지적하고 싶었습니다.
factorial n = product [1..n]
간결하고 효율적이며 스택을 오버플로하지 않습니다 n
(메모 화가 필요한 경우 완전히 다른 옵션이 필요합니다). product
일부의 관점에서 정의 fold
되는 되는 재귀 적으로 정의하지만, 아주 조심. 재귀 는 대부분 허용되는 솔루션이지만 여전히 잘못 / 차선책은 쉽습니다.