재인식 귀속

8052 단어 학습 노트

무엇이 귀속되는가


여기서 간단한 묘사로 말하자면, 귀속은 먼저 건네주고, 다시 건네주지 못할 때까지 다시 건네주는 것이다.적용 장면:...문장 보고 얘기하자...

귀속은 도대체 어떻게 생겼는가


나는 예전에 생물에 다닐 때'구조가 기능을 결정한다'는 말을 배운 적이 있는 것을 기억한다. 나는 여기에 이 말을 쓰면 더 이상 어울리지 않는다고 생각한다.귀속의 작용은 바로 그것이 컴퓨터의 논리 구조에서 그것의 기능을 결정하기 때문이다.
우선, 우리는 간단한 귀속 과정으로 귀속이 어떤 것인지 살펴보자
int digui(int a){
    if (a == 1) return 1;
    else return a + digui2(a-1);
}

이것은 간단한 귀속 과정으로 1에서 10의 귀속을 더하는 것이다.우리는 매개 변수가 10인 함수로부터 시작하는데, 이때 함수는 메모리에서 대체적으로 다음 그림으로 ([] 내의 숫자는 함수가 저장한 변수를 대표한다)
【10】
 9 , 
【10】【9】
 , 
【10】【9】【8】【7】【6】【5】【4】【3】【2】【1】
 , , , 
【10】【9】【8】【7】【6】【5】【4】【3】【3】
 
【10】【9】【8】【7】【6】【5】【4】【6】
 
【10】【45】
 
【55】

이 과정에서 귀환을 진행할 때마다 현재의 변수 값을 저장하여 후속 귀환 값을 준비하는 것을 알 수 있다.이것이 바로 귀속의 가장 큰 특징으로 변수 환경을 보존하는 것이다.그러나 귀환은 변수 환경뿐만 아니라 프로그램 계수기도 보존하고 있다. 다음은 하나의 나무의 깊이를 옮겨다니며 다음 귀환을 살펴보자.
static void f(Node root){
    if (root.left != null) f(root.left);
    System.out.println(root.value);
    if (root.right != null) f(root.right);
}

위의 이 함수는 진행할 때 상술한 것과 다르다. 단순히 [4][2]->[4][2][1]->[4][2]->[4][3]로 모의하는 것은 문제가 있다. 앞의 두 개의 집행과 뒤의 두 개의 집행 논리가 다르기 때문에 여기에 문제가 있다.그래서 여기에 프로그램 계수기의 개념을 도입하고자 한다. 우리는 [4,[0|1|2]로 하나의 함수 상태를 나타낸다. [0|1|2]는 함수가 몇 줄을 집행해야 하는 표지이다. 그러면 위의 상황은
41】【21】->
【41】【21】【10】->
【41】【21】【11】->
【41】【21】【12】->
【41】【21】->
【41】【22】->
【41】【22】【30

그래서 이렇게 표시하면 밝아진다.이제 귀속이 무엇인지 알겠다. 여기서 순환을 도입하여 귀속을 모의한다. (순환은 귀속을 대체할 수 있다고 말했을 뿐만 아니라 둘도 약간의 관계가 있다) 이제 나무의 깊이 귀속이 위와 같다는 것을 알았다. 그러면 순환의 방식으로 이 과정을 모의한다. 여기서 먼저 아날로그 함수 상태류를 도입한다.
 static class DiGuiInfo {
        public Node n;
        public int state = 0;// 
        DiGuiInfo(Node nn){n = nn;}
    }
Stack ss = new Stack<>();
DiGuiInfo cur = new DiGuiInfo(root);
do{
    switch(cur.state){
        case 0:
            cur.state++;
            ss.push(cur);
            if(cur.n.left != null){
                cur = new DiGuiInfo(cur.n.left);
                break;
            }
        case 1:
            cur.state++;
            System.out.println(cur.n.value);
            if (cur.n.right != null){
               cur = new DiGuiInfo(cur.n.right);
               break;
            }
       case 2:
            ss.pop();
            if (!ss.empty()){
                cur = ss.peek();
                break;
    }
}while(!ss.empty());

상술한 것은 바로 제가 이 과정에 대한 시뮬레이션(이 코드는 잘 쓰지 못했지만 양해해 주십시오)이기 때문에 이때 우리는 귀속적인 문법과 순환의 차이점을 비교해 보겠습니다. 1. 문법에서 귀속함수의 문법은 의심할 여지없이 매우 간단합니다. 왜냐하면 순환에서 주의해야 할 세부 사항은 모두 함수 호출의 특질에서 해결되기 때문입니다.2. 공간 측면에서 앞에서 메모리에 귀속되는 시뮬레이션을 보면 상기 순환하는 문법에 비해 두 사람이 차지하는 메모리의 차이가 많지 않다는 것을 알 수 있다.3. 시간적인 측면에서 이것은 단언할 수 없지만 내가 현재 함수 호출에 대한 이해로 볼 때 매번 전환하는 방법은 사실 지침의 변화이고 다른 조작에 대응할 수 있겠지만 이 시간은 일정한 범위 내에서 큰 영향을 미치지 않을 것이다.
그래서 위에서 비교한 바와 같이 나는 순환이 잘 돌아가는 것에 대해 찬성하지 않는다.그러나 전부는 아니다. 꼬리 귀속 모델에서 순환은 귀속보다 확실히 더 좋다. 가장 뚜렷한 것은 공간 복잡도라는 점이다.

귀착에 대한 총결산


귀환이라는 과정을 연구한 후에 매번 귀환이 자신의 함수가 아니라 다른 함수로 호출된다면 우리가 쓴 프로그램은 사실 귀환이라는 상태에서 실행된다는 것을 놀랍게 알게 되었다.이때 내가 귀속에 대한 이해는 더 이상 자신의 함수를 호출하는 특징이 아니라 임의의 함수를 호출하는 함수 과정 자체가 귀속이다.(내 프로그래밍관을 갱신했다)
또한, 귀속적인 문법으로 창고 모델을 사용하는 것이다(또는 프로그램이 어느 창고로 운행하는지를 기록할 수 있다). 그러면 때때로 프로그램을 쓸 때 창고를 쓰지 않고 귀속으로 쓸 수 있다. 이때의 귀속은 일종의 문법 설탕처럼 보일까, 아니면 함수에서 탄생한 문법 설탕처럼 보일까!
사실 그 전에 나는 몇몇 언어가 꼬리로 돌아가는 최적화가 있다는 것을 알게 되었다. (이것은 확실히 필요한 것이다.)그때 저는 다른 귀환은 최적화할 수 없다고 생각했습니다. 위의 이런 것들을 연구한 후에 저는 일반적인 귀환은 최적화할 수 없는 것이 아니라 최적화의 가치가 크지 않다는 것을 알게 되었습니다. 마지막 귀환이 최적화될 수 있는 이유는 공간 복잡도에서 최적화할 수 있기 때문입니다. 일반적인 귀환의 공간 복잡도는 필요하기 때문에 최적화를 해야 합니다. 어디를 최적화해야 하는지도 일반적인 귀환을 최적화하는 특징이 없습니다.
마지막으로 귀환이 무슨 소용이 있을까. 여기까지 썼을 때 나는 우리가 귀환이 무엇인지 알 필요가 없다고 생각했다. 사실 귀환이 바로 우리 곁에 있는데 그것이 귀환이라고 하는지 몰랐을 뿐이다.그리고 하나 더 있죠. 창고에 대한 사용을 간소화하는 거죠.(이것은 아직 실천하지 못했다)

함수식 프로그래밍의 귀속을 이야기하다


(이곳에서 귀속에 대한 정의는 임의의 함수에 대한 함수 호출 과정이다) 함수식 프로그래밍 언어에서 함수는 부작용이 없기 때문에 전역 변수라는 개념도 없다. 그러나 전역 변수는 프로그래밍에서 때로는 없어서는 안 될 때가 있다. 그러면 이 문제를 어떻게 해결해야 하는가?그래서 여기는 귀환으로 해결한다. 귀환할 때 변수를 보존하는 특징이 있기 때문에 전체적인 변수를 실현할 수 있다. 이런 변수는 가장 바깥쪽에 쓰면 된다.또한 함수식 프로그래밍 언어에서 귀환을 사용하는 곳이 하나 더 있는데 그것이 바로 순환할 때 이 원인도 잘 이해된다.꼬리 귀속은 순환으로 최적화할 수 있기 때문에 순환은 꼬리 귀속으로 쓸 수 있고 나중에 어셈블리로 컴파일할 때 순환으로 최적화하면 된다.왜 이러는 거예요?나는 개인적으로 함수식 프로그래밍 언어는 그 자체가 설계할 때 대로에서 간략한 이치에 따라야 한다고 생각한다. 함수가 해결할 수 있는 문제는 다른 것을 도입할 필요가 없다(여기서 함수식 프로그래밍 언어에서 함수의 우월감을 느낀다....이 우월감은'패키지 아날로그 대상'에서 알 수 있다).

좋은 웹페이지 즐겨찾기