2013-02-24 4 views
2

저는 하스켈에 대해 새로운 지식을 갖고 있으며 몇 가지 기본 사항을 이해하려고합니다. 재귀 함수를 작성할 때, 필자는 자연스럽게 재귀 적 또는 꼬리 재귀 적 방식으로 작성합니다.재귀 함수를 테일 재귀로 변환

내 질문은 :

  1. 어떤 재귀 함수를 감안할 때, 꼬리 재귀로 변환 할 수있는 간단한 방법이 있을까요?

  2. 꼬리 재귀 함수가 있으면 재귀 적으로 쉽게 변환 할 수 있습니까?

예 기능

또한
addOne [] = [] 
addOne (x:xs) = (x+1):addOne xs 

, 함수를 작성할 때, 꼬리 재귀가 대안을 더 적합한 지 알 수있는 가장 쉬운 방법은 무엇입니까?

+9

"꼬리 재귀 함수를 사용하면 재귀 적으로 쉽게 변환 할 수 있습니까?"- 모든 꼬리 재귀 함수는 자연스럽게 재귀 적입니다. 그렇지 않습니까? –

+0

예,하지만 이것은 제 질문과 아무런 관련이 없습니다. 재귀 적 함수와 꼬리 재귀 함수를 작성하는 것은 동일한 작업을 수행 할 수있는 완전히 다른 두 개의 프로그램 (구문 적으로)입니다. 따라서 하나는 다른 것으로 변환 될 수 있습니다. – AnchovyLegend

+0

@Mi : 아니요, 꼬리 재귀 함수는 항상 반복적이며 함수는 그 자체와 완전히 다른 것이 아니라 구문 적으로도 다른 어떤 측면에서도 다릅니다. –

답변

2

저는 하스켈을 처음 사용했습니다. 내가 읽은 바에 따르면, 명시 적 재귀는 Haskell 커뮤니티에서 눈살을 찌푸리게됩니다. 오히려 Haskell은 프로그래머가 일반적인 재귀 연산을 캡슐화하는 map, filter, foldl, foldr 등과 같은 표준 함수를 사용하도록 권장합니다. 예를 들어,

addOne [] = [] 
addOne (x:xs) = (x+1):addOne xs 

는 다음과 같이 추가 점없는 스타일을 사용하여 단계를 가고,

addOne xs = map (+1) xs 

로 작성하거나 할 수

가능성 경우가 있습니다
addOne = map (+1) 

곳이 표준 기능 돈 쉽게 맞지 않고 자신 만의 재귀 함수를 작성해야합니다. 그러나 명백한 재귀를 구현하려는 유혹을받을 수있는 경우의 90 %를 커버한다고 생각합니다.

본인의 질문에 정확히 답변하지는 않지만 귀하에게 고려해야 할 아이디어가 있기를 바랍니다.

1

어떤 재귀 함수가 주어지면 꼬리 재귀로 변환하는 쉬운 방법이 있습니까?

번호

꼬리 재귀 함수 감안할 때, 재귀로 변환하는 쉬운 방법이

?

예. @ Joachim Breitner가 이미 말했듯이 아무 것도하지 않고 아무 것도 취소 할 수 없습니다 (Lao Tse). 그러나 recursive의 정의는 일반적인 것에서 벗어난 것처럼 보이므로 어쩌면 당신이 의미하는 바를 말할 수 있습니다.

+0

+1, 쓸모없는 대답을 경악. – AnchovyLegend

관련 문제