평론이 귀착되다.

3953 단어
정의
영어 정의: Recursion is the process of repeating items in a self-similar way.
구체적으로 컴퓨터에 들어가다.
역귀: 역회라고도 하는데 수학과 컴퓨터 과학에서 함수의 정의에서 함수 자체를 사용하는 방법을 가리킨다.
[상기 정의의 출처는wiki].
영어의 Recursion은 반복적으로 발생하고 다시 재현된다는 뜻을 나타낸다.대응하는 중국어 번역'귀속'은 두 가지 뜻을 분명히 나타냈다.'귀속'+ 귀속'이다.이 두 가지 뜻은 바로 사상의 정수로 돌아가는 것이다.

귀착사상


귀착의 기본 사상은 규모가 큰 문제를 규모가 작은 비슷한 하위 문제로 바꾸어 해결하는 것이다.이런 사상은 수학에서의 귀납법과 매우 가깝다.
귀속은 프로그램에서 나타난다. 함수가 귀속을 실현할 때 큰 문제를 해결하는 방법과 작은 문제를 해결하는 방법은 종종 같은 방법이기 때문에 함수가 그 자체를 호출하는 상황이 발생한다.주의해야 할 것은 귀속 함수는 반드시 뚜렷한 끝 조건(base case)이 있어야 무한 귀속이 발생하지 않는다는 것이다.
N의 계승 문제
우리는 5를 안다!5*4*3*2*1;4!=4*3*2*1;…
            5!=5*4!...
위에서 우리는 N을 귀납할 수 있다.N*(N-1)!,이 함수의 코드는 다음과 같습니다.
public static long factorial(int n){

      if(n==1) // base case

         return 1;

      else  // reduction step

         return n*factorial(n-1);

   }

Base case: 베이스라인 조건, 귀속 종료 조건
Reduction step: 반복 작업, 문제에 대한 정의.

반복 vs 순환


대다수의 상황을 보면, 귀속과 순환은 서로 전환할 수 있다.예를 들어 위의 곱셈 문제, 만약 계산한 곱셈 방법이 n!=n*(n-1)*….*2*1은 분명히 순환하는 과정이다. 만약에 곱셈을 계산하는 방법이 n=n*(n-1)이라면!이것은 귀속 정의를 귀납해 냈다.순환은 한 문제를 어떻게 해야 할지 생각해야 하고, 한 문제의 정의를 생각해야 한다.
실제 개발에서 순환은 더욱 흔하지만 일부 경우 순환을 귀속(면접)으로 전환해야 할 수도 있다.귀환과 순환은 사실 납득할 수 있는 부분이 매우 많은데, 그것들은 모두 초기 조건과 종지 조건을 필요로 한다.귀환으로 순환 문제를 해결하려면 기선 조건과 귀환 문제를 명확히 정의해야 한다(한 걸음 한 걸음 귀환 조작하는 알고리즘). 본인은 면접 과정에서 두 개의 수의 최대 공약수를 구하고 순환을 사용하지 않는다.사실, 뒤에 있는 그'순환을 사용하지 않는다'는 말은 분명히 고귀적이다.Java 코드는 다음과 같습니다.
//  

   public static int gcd(int num1,int num2){

      // check args

      if(num1==0 || num2==0){

         return 0;

      }
      // num1>num2

      int tmp = num1;

      num1 = Math.max(num1,num2);

      num2 = Math.min(tmp, num2);

      int p = num1%num2;

      /*while(p!=0){

         num1 = num2;

         num2 = p ;

         p = num1%num2;

      }*/

      if(p!=0)

         return gcd(num2,p);

      return num2;
   }

 
위에서 볼 수 있듯이 순환환귀환은 두 가지 점을 파악해야 한다.
  • 순환의 종지 조건과 귀속 중의 기선 조건
  • 순환 중의 알고리즘과 귀속 알고리즘
  • 응용 프로그램


    문제의 정의 자체가 귀속 형식일 때 귀속을 고려할 수 있다.데이터 구조 안의'트리'는 전형적인 귀속 정의이다.그리고 위에서 말한 계승, 한노타 문제, 피폴라치 수열 등.모두 사용하여 문제를 점차적으로 해결할 수 있다.
    귀환을 사용하면 짜임새 있고 우아한 코드를 사용하여 무섭게 보이는 문제를 해결할 수 있다.그러나 실제로는 귀환이 흔치 않다.우선, 함수 집행 과정에서 창고 공간의 분배는 유한한 것이기 때문에 귀속의 깊이가 너무 크면 창고 공간의 넘침을 초래할 수 있다.그 다음으로 프로그램의 쓰기 효율을 향상시켰지만 실행 효율이 향상된 것은 아니다.일반적으로 귀속의 집행 효율이 반드시 순환보다 높지 않다. 왜냐하면 창고에 새로운 공간을 개척하고 국부 변수를 분배하는 것은 모두 시간 비용이 필요하기 때문이다. 특히 귀속의 깊이가 매우 클 때이다.그래서 학습의 귀착은 주로 그 사상을 배우는 것이다. 규모가 큰 문제를 규모가 작은 유사자 문제로 바꾸어 해결하는 것이다.
    윗사람의 베테랑 우리들의 한마디를 거울로 삼아 개인적으로 잘했다고 생각한다.
    네가 문제를 투철하게 분석하면 언제 사용할지 자연히 밝혀질 것이다.귀환은 함수 호출의 기교일 뿐 문제를 해결하는 공식이 아니다.하나의 문제는 귀환으로 할 수도 있고, 귀환으로 하지 않아도 된다. 귀환은 필수적인 것이 아니다.그래서 당신이 해결해야 할 문제를 이해하고 문제를 해결하는 절차와 방법을 똑똑히 생각하면 원래는 귀환으로 문제를 간소화할 수 있다는 것을 알게 될 것입니다.처음부터 어떻게 되돌려야 할지 생각하지 마라.
    참조 자료:
       http://zh.wikipedia.org/wiki/%E9%80%92%E5%BD%92
       http://www.zhihu.com/question/20507130
       http://www.zhihu.com/question/20096035
       http://www.ibm.com/developerworks/cn/linux/l-recurs.html

    좋은 웹페이지 즐겨찾기