재귀의 장점은 무엇입니까?
일부 프로그래밍 언어는 테일 재귀를 최적화 할 수 있지만 여전히 일반적인 용어로 재귀는 일반 루프보다 많은 리소스를 소비합니다.
재귀 함수의 반복 버전을 사용할 수 있습니까?
재귀의 장점은 무엇입니까?
일부 프로그래밍 언어는 테일 재귀를 최적화 할 수 있지만 여전히 일반적인 용어로 재귀는 일반 루프보다 많은 리소스를 소비합니다.
재귀 함수의 반복 버전을 사용할 수 있습니까?
답변:
예, 재귀 함수를 반복으로 코딩 할 수 있습니다. 기본적으로 컴파일러가 생성 한 코드를 호출하는 메소드가 처리 한 정보를 수동으로 유지 보수해야합니다.
즉, 각 항목이 전달 된 매개 변수와 모든 로컬 변수를 포함하는 구조 인 스택이 필요합니다. 항상 스택의 최상위 항목에서 작업합니다. 직접 전화해야하는 경우 새 항목을 작성하고 스택 위에 놓으십시오. 완료되면 아래의 항목을 노출시키는 스택의 최상위 항목을 가져 와서 이전 최상위 항목을 사용하여 반환 값을 추출하고 그에 따라 새 최상위 항목을 업데이트하십시오.
나는 이것이 보통 기계 코드에서 어떻게 구현되는지 확인하기 위해 컴파일러 책을 연구 할 것을 제안한다.
재귀는 종종 반복보다 사물을 보는 더 자연스러운 방법입니다. 예를 들어, 이진 트리의 순서 순회를 고려하십시오 inorder(left); process(); inorder(right);
. 스택을 명시 적으로 유지 관리하는 것보다 훨씬 간단합니다.
너무 깊이 들어 가지 않는 한 (스택을 날리는) 리소스 사용의 차이는 보통 사소합니다. 일반적으로 걱정하지 마십시오. 간단한 코드는 일반적으로 수동 최적화 코드보다 낫지 만 예외는 있습니다. 일반적으로 빠름보다 낫습니다.
재귀 알고리즘은 반복 알고리즘으로 표현할 수 있지만 암시 적으로 처리되는 호출 스택에 해당하는 명시 적 스택을 유지해야 할 수도 있습니다. 결국, 재귀 함수를 컴파일하면 스택을 조작하고 함수를 반복하는 데 의존하는 무언가를 얻습니다. 반복적입니다.
테일 재귀 함수는 루프로 쉽게 변환 할 수 있으며 스택이 필요하지 않지만 특별한 경우입니다.
재귀의 장점은 무엇입니까?
간단. 꼬리 호출 최적화가 없다면 물론 더 많은 리소스 (스택)가 필요하지만 deltree
재귀없이 Java로 어떻게 구현 합니까? 트위스트는 delete()
디렉토리가 비어있는 경우에만 디렉토리를 삭제할 수 있다는 것입니다 . 재귀와 함께 여기 있습니다 :
deltree(File fileOrDirectory) {
if (fileOrDirectory.isDirectory()) {
for (File subFileOrDirectory : fileOrDirectory.listFiles()) {
deltree(subFileOrDirectory);
}
}
fileOrDirectory.delete();
}
나는 재귀가 프로그래머 가 살아야 하는 도구 중 하나라고 생각합니다 . 재귀를 사용하면 알고리즘을 "생각"하고 생각한대로 해결할 수 있습니다. 그러나 나는 당신에게 경고해야합니다. 모두가 할 말이 몇 가지 있다는 점에서 모든 사람들이 재귀가 얼마나 예쁜지, 얼마나 간단하게 코드에 가져 오는지 이야기하고 있습니다.
그런 것들을 염두에두고 재귀를 배우십시오! 재미 있고 복잡하며 두뇌를 박살낼 것입니다!
행운을 빌어 요!