2012-02-11 2 views
2

재귀 함수를 작성할 때 재귀 알고리즘의 첫 번째 패스에서만 발생해야하는 경우가 있습니다. 이것이 사실 때, 나는 두 가지 옵션, 재귀 함수 - 두 개의 함수 또는 마지막 선택적 매개 변수

  1. 는 기본적으로 true로 설정하지만, 재귀 적으로 호출하면된다 "처음 실행"라는 선택적 매개 변수가이 인수는
  2. 이 두 가지 기능을 가지고 거짓

어떤 옵션이 더 좋습니까? 후자의 경우이 함수의 이름을 무엇이라고해야합니까? (예 : 플러드 채우기 알고리즘을 사용하여 FloodFillFloodFillRecursive을 선택하는 경우)

미리 감사드립니다.

답변

4

두 함수를 사용할 수 있으며 호출 할 함수의 이름은 FloodFill이어야합니다. 사용자는 해당 함수가 구현되는 방식을 알 필요가 없으므로 FloodFillRecursive으로 지정하면 안됩니다.


사실 FloodFillRecursive내측 함수의 이름이 될 수있다 : 구현을 포함하는 한, 그상의 사용자에 의해 호출 된 하나에 의해 호출 -이 제 기능 재귀 그 것을 그대로 .
이상적으로 그 함수는 사용자가 볼 수 없어야합니다. 라이브러리 에 숨겨져 있어야합니다 (사용자가 직접 호출해서는 안되는 일부 명명 규칙을 사용하십시오).

이렇게하면 구현을 변경하면 사용자가 더 이상 재귀 적이 아닌 FloodFillRecursive 함수를 호출하지 않게됩니다.

+0

이것은 정확히 내가 생각한 것입니다. - 제가 베스트 프랙티스를 사용하고 있는지 확인하고있었습니다. 나는이 질문을 열어두고 다른 대답을 얻을 수 있는지 알아볼 것입니다. 귀하의 의견을 보내 주셔서 감사합니다! – Ell

+0

당신은 환영합니다 :-) –

1

실제로 타사 개발자가이 기능을 사용할 수 있는지 여부는 실제로 다릅니다. 두 번째 함수 (FloodFillRecursive)를 라이브러리에 private/internal로 사용하면 깔끔함을 위해 두 가지 함수 접근 방식을 사용하는 것이 좋습니다.

그렇지 않은 경우 선택적 매개 변수 접근이 좋습니다.

1

옵션 2는 내가 생각할 수있는 모든 경우에 더 좋습니다. 이것은 사용하는 언어에 따라 다르지만 매번 추가 인수를 전달함으로써 훨씬 많은 오버 헤드가 발생할 수 있습니다.

명명 규칙은 외부 함수 (예 : FloodFill)의 일반 이름을 사용하십시오. 내부 함수에 대해서는 FloodFillRecursive 또는 FloodFillInner가 좋은 선택이라고 할 수 있습니다.

+0

아 나는 오버 헤드를 생각하지 않았어, 고마워! – Ell

1

언어가 허용하는 경우 제 생각에는 공식적인 "깨끗한"인터페이스와 재귀를 위해 로컬 함수 (외부에서 볼 수없는)를 사용하는 것이 가장 좋습니다. CL의 예 상기 실시 예에서

(defun n-queens (n) 
    (let ((result (list))) 
     (labels ((place-queen (row free-cols free-diagonals free-counter-diagonals) 
        ...)) 
     (place-queen 0 ...) 
     result))) 

파이썬

def n_queens(n): 
    result = [] 
    def place_queen(row, free_cols, free_diags, free_counter_diags): 
     ... 
    place_queen(0, ...) 
    return result 

들어

재귀 함수는 많은 파라미터를 필요로하는 (예를 들어대각선 및 대각선)이지만 공식 공용 함수는 매개 변수 만 받아들이고 재귀는 내부적으로 처리됩니다.

+0

이것도 생각하지 않았어, 고마워! – Ell