재귀 함수 호출의 return 문 이유


14

난 그냥 내 마음에 의심했다. 다음과 같은 서브 루틴 (예를 들어 목록에서 요소를 검색)에는 끝에 return 문이 있습니다.

list *search_list(list *l, item_type x) {
  if (l == NULL) return(NULL);
  if (l->item == x)
    return(l);
  else
    return( search_list(l->next, x) );
}

끝에 return 문의 중요성을 얻을 수 없습니다 (예 : return search_list (l-> next, x)). 누군가가 스택 모델을 사용 하여이 개념을 설명 할 수 있다면 정말 도움이 될 것입니다.


목록의 첫 번째 용어가 결과가 아닌 경우 나머지 목록을 검색하십시오 . 이것이 마지막 일 return입니다.
Giorgio

@Giorgio, 왜 함수 호출만으로 충분하지 않았을까요? 왜 그 전에 리턴이 필요한가요?
user1369975 5

7
함수가 반환 한 값을 반환해야하기 때문에
Esailija

7
Downvoters : OP의 배경에 따라 그것이 무엇을하는지 return는 전혀 명확하지 않다는 것을 이해하십시오 . 실제로, 기능적 언어 (및 스칼라와 같은 일부 혼합 언어) return 에서는 필요하지 않습니다 . 재귀 함수의 값은 마지막 표현의 값입니다. 스칼라에서 쓰지 search_list(l->next, x)않고 단순히 글을 쓰면 됩니다 return! 이 return문장 의 의미 는 명령적인 배경을 가진 프로그래머에게만 분명합니다.
Andres F.

OP : 코드 스 니펫이 C로 작성 되었습니까?
Andres F.

답변:


19

return 문은 현재 함수의 호출 프레임의 즉시 호출자 에게 값을 다시 전달합니다 . 재귀의 경우,이 즉시 호출자는 동일한 기능을 다시 호출 할 수 있습니다.

대부분의 언어에서 호출 한 함수의 반환 값을 사용하지 않으면 (반복적으로 또는 반환하지 않음) 해당 반환 값이 삭제되거나 진단 가능한 오류입니다. 마지막 함수 호출의 반환 값이 현재 함수 호출의 반환 값으로 자동 재사용되는 일부 언어가 있지만 일반 함수와 재귀 함수 호출을 구분하지는 않습니다.

다음과 같이 코드를 작성한 경우 사용하지 않은 반환 값이 자동으로 삭제된다고 가정합니다.

list *search_list(list *l, item_type x) {
  if (l == NULL) return(NULL);
  if (l->item == x)
    return(l);
  else
    search_list(l->next, x); // no return!
}

그런 다음 search_list빈 목록에 대해 정의 된 값을 반환하거나 (NULL) 첫 번째 항목이 검색하려는 값과 일치하는 경우에만 반환합니다. 함수가 재귀 호출에 들어가 자마자 재귀 호출의 결과가 삭제되므로 결과가 무엇인지 알 수 없습니다.

또한 함수에서 값을 반환 할 것을 약속하지만 반환 할 값을 지정하지 않는 경로 (재귀 경로)가 있습니다. 사용하는 언어에 따라 일반적으로 필수 진단 또는 정의되지 않은 동작이 발생합니다 (약칭 : 어떤 일이 발생할 수 있으며 예고없이 언제든지 변경 될 수 있음). 가장 중요한 프레젠테이션). 누락 된 리턴 값이 작동하는 것처럼 보일 수 있지만 다음에 프로그램을 다시 실행할 때 (재 컴파일 유무에 관계없이) 변경 될 수 있습니다.


FWIW는, 펄은 내가, 자동으로 마지막 식의 결과를 반환 생각 이 반환 값을 다시 것을 의미합니다. 그러나 나는 몇 년 동안 그것을 만지지 않았으므로 확실하지 않습니다.
Bobson 2016 년

1

두가지; 찾고있는 "x"를 찾은 경우 전체 목록을 반환한다고해서 반드시 재귀를 사용해야하는 것은 아니지만 다음 사항을 고려하십시오.

X = "12 월"값을 찾고 있고 목록이 해당 연도의 숫자 값이고 다음 달에 대한 포인터이고 목록의 l-> 항목이 철자 이름이라고 가정합니다. 개월. (1 월, 2 월, ..., 12 월). 가능한 결과를 얻으려면 세 가지 수익이 필요합니다. 목록에 원하는 X가 포함되어 있지 않으면 첫 번째 return (NULL)이 필요합니다. 두 번째, (return (l))은 목록을 반환하며,이 경우 "x"를 찾았 음을 알려줍니다. 마지막은 스택 모델이 작동하는 곳입니다. 함수를 연속적으로 호출하면 다음과 같이 로컬 변수 (특히 l-> 항목)가 업데이트됩니다.

1: l->item = January
   returns search_list(l->next, x)
2: l->item = February
   returns search_list(l->next, x)
3-11: March, April, May, June, July, August, September, October, November
   all return search_list(l->next, x)
12: l->item = December
  This matches the second if() and returns your list, letting you know you found your search item.

, 일러스트 주셔서 감사하지만 실제로 마지막 반환을 사용하지 않습니다
user1369975

마지막 반환 없이는 1 단계를
지나치지
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.