머리말
나는 최근에 책을 읽을 때이 콘텐츠를 보았고 상당히 보람이 느껴졌습니다. 반복은 루프 조건이 충족되지 않을 때 종료되는 루프 (Where, Do ... Wile) 또는 반복기를 사용합니다. 재귀는 일반적으로 기능 재귀이며,이 기능 재귀이며, 이는 자체적으로 또는 비 다차적 인 호출, 즉 메소드 A 호출 메소드 B 및 메소드 B 호출 메소드 A를 차례로 호출 할 수 있으며 재귀 종료 조건은 IF 및 Else 명령문이며 조건이 기본을 충족 할 때 종료됩니다.
위는 반복 및 재귀의 구문 특성입니다. 자바에서 그들 사이의 차이점은 무엇입니까? 아래이 기사에 대해 자세히 알아 보겠습니다.
1. 재귀
반복과 관련하여, 우리는 수학적 표현을 언급해야합니다 : n!=n*(n-1)*(n-2)*...*1
계승을 계산하는 방법에는 여러 가지가 있습니다. 특정 수학적 기초를 가진 사람은 n!=n*(n-1)! 따라서 코드 구현은 다음과 같이 직접 작성할 수 있습니다.
코드 1
int factorial (int n) {if (n == 1) {return 1; } else {return n*factorial (n-1); }} 위의 코드를 실행할 때 기계는 실제로 일련의 곱셈을 수행해야합니다 : factorial(n) → factorial(n-1) → factorial(n-2) →… → factorial(1) . 따라서, 계산을 추적하고 (마지막 계산의 결과를 추적)를 추적하고 계산을 수행하기 위해 곱셈 (곱셈 체인 구축)이 필요합니다. 지속적으로 자체 호출하는 이러한 유형의 작업을 재귀라고합니다. 재귀는 선형 재귀 및 수치 재귀로 더 나눌 수 있습니다. 정보의 양은 알고리즘의 입력으로 선형으로 증가합니다. 재귀를 선형 재귀라고합니다. n을 계산하십시오! (공장)은 선형 재귀입니다. N이 증가함에 따라 계산에 필요한 시간이 선형으로 증가합니다. 입력 증가로 기하 급수적으로 성장하는 다른 유형의 정보를 트리 재귀라고합니다.
2. 반복
n을 계산하는 또 다른 방법! IS : 먼저 1을 2로 곱한 다음 결과에 3을 곱한 다음 결과에 4를 곱한 다음 N까지 곱하십시오. 프로그램 구현 중에 카운터를 정의 할 수 있습니다. 곱셈이 수행 될 때마다 카운터의 값이 N과 같을 때까지 카운터가 한 번 증가합니다. 코드는 다음과 같습니다.
코드 2
int factorial (int n) {int product = 1; for (int i = 2; i <n; i ++) {product *= i; } 반품 제품;}코드 1과 비교하여 코드 2는 곱셈 체인을 구축하지 않습니다. 각 계산 단계를 수행 할 때는 현재 결과 (제품)와 i의 값 만 알아야합니다. 이 형태의 계산을 반복이라고합니다. 반복을위한 몇 가지 조건이 있습니다. 1. 초기 값을 가진 변수가 있습니다. 2. 가변 값이 어떻게 업데이트되는지 설명하는 규칙. 3. 끝 조건. (루프의 3 가지 요소 : 루프 변수, 루프 본체 및 루프 종료 조건). 재귀와 동일합니다. 입력이 선형으로 증가함에 따라 선형이되는 시간 요구 사항을 선형 반복이라고 할 수 있습니다.
3. 반복 대 재귀
두 프로그램을 비교 한 후에는 특히 수학적 기능 측면에서 거의 동일하게 보입니다. n!을 계산할 때, 그들의 계산 단계는 n 값에 비례합니다. 그러나 프로그램의 관점을 취하고 실행 방법을 고려하면 두 알고리즘이 매우 다릅니다.
(참고 : 원본 텍스트는 차이와 관련이 없으므로 여기서는 번역하지 않을 것입니다. 다음은 저자의 요약입니다.)
우선, 재귀를 분석하십시오. 실제로, 재귀의 가장 큰 것은 복잡한 알고리즘을 몇 가지 동일한 반복 가능한 단계로 분해하는 것입니다. 따라서 재귀를 사용하여 계산 논리를 구현하려면 종종 해결해야 할 매우 짧은 코드 만 필요하며 이러한 코드는 이해하기 쉽습니다. 그러나 재귀는 많은 기능 호출을 의미합니다. 함수 호출의 로컬 상태가 스택을 사용하여 기록되는 이유. 따라서 이것은 많은 공간을 낭비 할 수 있으며, 재귀가 너무 깊다면 스택 오버플로가 발생할 수 있습니다.
다음으로 반복을 분석하십시오. 실제로 재귀는 반복으로 대체 될 수 있습니다. 그러나 재귀의 단순성과 이해와 비교하여 반복은 더 엄격하고 이해하기 어렵다. 특히 더 복잡한 시나리오를 만날 때. 그러나 코드에 대한 이해가 어려워지면 더 명백한 요점이 있습니다. 반복의 효율은 재귀보다 높으며 우주 소비에서도 비교적 작습니다.
재귀에는 반복이 있어야하지만 반복에는 재귀가 없을 수 있으며 대부분은 서로 변환 될 수 있습니다.
반복을 사용할 수있는 경우 재귀를 사용하지 마십시오. 호출 함수는 재귀 적으로 공간을 낭비 할뿐만 아니라 재귀가 너무 깊을 경우 스택 오버플로를 쉽게 유발할 수 있습니다.
4. 숫자의 재귀
앞에서 언급했듯이, 입력 증가에 따라 트리 재귀가 기하 급수적으로 증가하는 정보의 양. Fibonacci 시퀀스는 전형적인 예입니다.
텍스트 설명에서 Fibonacci 시퀀스에서 처음 두 숫자의 합은 세 번째 숫자와 같습니다 : 0, 1, 1, 2, 3, 5, 8, 13, 21 ...
재귀 구현 코드는 다음과 같습니다.
int fib (int n) {if (n == 0) {return 0; } else if (n == 1) {return 1; } else {return fib (n-1) + fib (n-2); }} 계산 과정에서 fib(5) 계산하기 위해 프로그램은 먼저 fib(4) 및 fib(3) 계산해야합니다. fib(4) 계산하려면 프로그램은 먼저 fib(3) 및 fib(2) 계산해야합니다. FIB (3)는이 과정에서 두 번 계산됩니다.
위에서 분석 한 계산 프로세스에서 우리는 결론을 도출 할 수 있습니다. 재귀를 사용하여 Fibonacci 서열을 구현하기위한 중복 계산이 있습니다.
위에서 언급 한 바와 같이, 재귀 알고리즘은 일반적으로 반복적으로 구현 될 수 있으며, Fibonacci 서열 계산에 대해서도 마찬가지입니다.
int fib (int n) {int fib = 0; int a = 1; for (int i = 0; i <n; i ++) {int temp = fib; fib = fib + a; a = 온도; } return fib;}재귀 방법에는 중복 계산이있을 것이지만 반복으로 대체 할 수 있습니다. 그러나 이것이 재귀를 완전히 대체 할 수 있다는 것을 의미하지는 않습니다. 재귀는 가독성이 향상되기 때문입니다.
요약
위는이 기사의 전체 내용입니다. 이 기사의 내용이 Java를 배우거나 사용하는 모든 사람들에게 도움이되기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다.