>  기사  >  Java  >  Java의 반복 및 재귀 예제에 대한 자세한 설명

Java의 반복 및 재귀 예제에 대한 자세한 설명

怪我咯
怪我咯원래의
2017-07-02 10:23:461601검색

이 글에서는 주로 Java의 반복과 recursion을 소개합니다. 글에서는 Java의 반복과 재귀를 각각 소개한 다음, 반복과 재귀의 차이점과 수치 재귀 관련 내용을 소개합니다. 자세히 소개하고 있으니, 도움이 필요한 친구들이 참고할 수 있는 자료가 될 것 같습니다.

서문

최근에 책을 읽다가 이 내용을 봤는데 꽤 보람을 느꼈습니다. 반복은 루프(for, while, do...wile) 또는 반복자를 사용하며 루프 조건이 충족되지 않으면 종료됩니다. 재귀, 일반적으로 함수 재귀는 자신을 호출할 수도 있고 간접 호출일 수도 있습니다. 즉, 메서드 A가 메서드 B를 호출하고 메서드 B가 차례로 메서드 A를 호출합니다. 재귀 종료 조건은 if, else 문 입니다. 기본이 충족되면 조건이 종료됩니다.

위는 반복과 재귀의 구문 기능이 Java에서 어떻게 다른가요? 아래 기사를 통해 이에 대해 자세히 알아보세요.

1. 재귀

반복에 관해서는 수학적 표현식을 언급해야 합니다: n!=n*(n-1)*(n-2)*... *1 n!=n*(n-1)*(n-2)*...*1

有很多方法来计算阶乘。有一定数学基础的人都知道n!=n*(n-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*(n-1)!을 알고 있으므로 코드 구현을 직접 작성할 수 있습니다.

Code 1

int factorial (int n) {
 int product = 1;
 for(int i=2; i<n; i++) {
  product *= i;
 }
 return product;
}
위 코드를 실행할 때 , 실제로 기계는 일련의 곱셈을 수행합니다: factorial(n) factorial(n-1) factorial(n-2) → … → 계승(1). 따라서 지속적으로 추적(마지막 계산 결과를 추적)하고 계산을 위해 곱셈을 호출(곱셈 체인 구축)해야 합니다. 지속적으로 자신을 호출하는 이러한 유형의 작업을 재귀라고 합니다. 재귀는 다시 선형재귀와 수치재귀로 나눌 수 있습니다. 알고리즘의 입력에 따라 정보량이 선형적으로 증가하는 재귀를 선형 재귀라고 합니다. n!(계승) 계산은 선형 재귀입니다. N이 증가함에 따라 계산에 필요한 시간이 선형적으로 증가하기 때문입니다. 입력이 증가함에 따라 기하급수적으로 증가하는 또 다른 유형의 정보를 트리 재귀라고 합니다.

2. 반복

n을 계산하는 또 다른 방법은 먼저 1에 2를 곱하고 그 결과에 4를 곱한 다음 N까지 곱하는 것입니다. 프로그램을 구현할 때 곱셈이 수행될 때마다 카운터 값이 N과 같아질 때까지 카운터를 정의할 수 있습니다. 코드는 다음과 같습니다.

Code 2

int fib (int n) {
 if (n == 0) {
  return 0;
 } else if (n == 1) {
  return 1;
 } else {
  return fib(n-1) + fib(n-2);
 }
}
코드 1과 비교하여 코드 2는 곱셈 체인을 구축하지 않습니다. 각 계산 단계를 수행할 때 현재 결과(곱)와 i 값만 알면 됩니다. 이러한 계산 형태를 반복이라고 합니다. 반복에는 여러 가지 조건이 있습니다. 1. 초기 값이 있는 변수 가 있습니다. 2. 변수 값이 업데이트되는 방식을 설명하는 규칙입니다. 3. 종료 조건. (루프의 세 가지 요소: 루프 변수, 루프 본문 및 루프 종료 조건). 재귀와 동일합니다. 입력에 따라 선형적으로 증가하는 시간 요구 사항을 선형 반복이라고 부를 수 있습니다.

3. 반복 VS 재귀

두 프로그램을 비교해 보면 특히 수학적 기능 측면에서 거의 동일해 보인다는 것을 알 수 있습니다. n!을 계산할 때 계산 단계 수는 n 값에 비례합니다. 그러나 프로그램의 관점에서 작동 방식을 고려하면 두 알고리즘은 매우 다릅니다.

(참고: 원문은 차이에 대해 좀 엉뚱하므로 여기서는 번역하지 않겠습니다. 다음은 저자가 직접 요약한 것입니다.)

먼저 재귀를 분석해 보면 사실 재귀의 가장 큰 장점은 다음과 같습니다. 복잡한 알고리즘을 반복 가능한 여러 단계로 분해합니다. 따라서 재귀를 사용하여 계산 논리를 구현하면 해결하는 데 짧은 코드만 필요한 경우가 많으며 이러한 코드는 비교적 이해하기 쉽습니다. 그러나 재귀는 많은 함수 호출을 의미합니다. 함수 호출의 로컬 상태를 스택을 이용해 기록하는 이유. 따라서 이는 많은 공간을 낭비할 수 있으며 재귀가 너무 깊어지면 스택 오버플로가 발생할 수 있습니다.

다음으로 반복을 분석합니다. 실제로 재귀는 반복으로 대체될 수 있습니다. 하지만 간단하고 이해하기 쉬운 재귀에 비해 반복은 더 무뚝뚝하고 이해하기 어렵습니다. 특히 더 복잡한 장면을 접할 때는 더욱 그렇습니다. 하지만 코드를 이해하기 어렵다는 단점도 분명합니다. 반복은 재귀보다 효율적이며 공간을 덜 차지합니다.

반복에는 반복이 있어야 하지만 반복에는 반복이 없을 수 있으며 대부분 서로 변환이 가능합니다.

반복을 사용할 수 있다면 재귀를 사용하지 마세요. 재귀 호출 기능은 공간을 낭비할 뿐만 아니라 재귀가 너무 깊어지면 스택 오버플로가 발생하기 쉽습니다.

🎜🎜4. 숫자 재귀🎜🎜🎜

前面介绍过,树递归随输入的增长的信息量呈指数级增长。比较典型的就是斐波那契数列:

用文字描述就是斐波那契数列中前两个数字的和等于第三个数字: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)。

从上面分析的计算过程可以得出一个结论:使用递归实现斐波那契数列存在冗余计算。

就像上面提到的,可以用递归的算法一般都能用迭代实现,斐波那契数列的计算也一样。

int fib (int n) {
 int fib = 0;
 int a = 1;
 for(int i=0; i<n; i++) {
  int temp = fib;
  fib = fib + a;
  a = temp;
 }
 return fib;
}

虽然使用递归的方式会有冗余计算,可以用迭代来代替。但是这并不表明递归可以完全被取代。因为递归有更好的可读性。

위 내용은 Java의 반복 및 재귀 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.