python 3 재 귀 함수

2972 단어
저 는 집에 서 아 이 를 데 리 고 다 니 는 가짜 테스트 입 니 다.
학습 노트
  • 만약 에 한 함수 가 함수 체중 에서 자신 을 호출 하면 이 함 수 는 재 귀 함수
  • 이다.
  • 재 귀 함수 의 장점 은 정의 가 간단 하고 논리 가 명확 하 다 는 것 이다
  • .
  • 재 귀 함 수 를 사용 할 때 스 택 이 넘 치지 않도록 주의해 야 합 니 다. 컴퓨터 에서 함수 호출 은 스 택 (stack) 이라는 데이터 구 조 를 통 해 이 루어 집 니 다. 한 함수 호출 에 들 어 갈 때마다 스 택 프레임 을 추가 합 니 다. 함수 가 돌아 올 때마다 스 택 프레임 을 한 층 줄 이 고 스 택 의 크기 가 무한 하지 않 기 때문에 재 귀 호출 횟수 가 너무 많 으 면 스 택 이 넘 칠 수 있 습 니 다.
  • 끝 재 귀 는 함수 가 돌아 올 때 함수 자신 을 호출 하고 return 문 구 는 표현 식 을 포함 할 수 없습니다 = > 이것 은 표현 식 입 니 다: return n * fun (n - 1), return fun (n - 1)
  • 스 택 의 넘 침 을 해결 하 는 방법 은 끝 재 귀 를 통 해 최적화 하 는 것 이다. 그러면 컴 파일 러 나 해석 기 는 끝 재 귀 를 최적화 시 켜 서 재 귀 자 체 를 몇 번 호출 하 든 한 스 택 프레임 만 차지 하고 스 택 이 넘 치 는 상황 이 발생 하지 않도록 하 는 것 이다
  • 유감, 유감, 유감: 대부분의 프로 그래 밍 언어 는 끝 재 귀 에 최적화 되 지 않 았 고 python 해석 기 도 최적화 되 지 않 았 기 때문에 python 의 재 귀 함 수 를 최적화 하 더 라 도 스 택 이 넘 치 는 상황 이 존재 할 수 있 습 니 다
  • code
    #   1:        :  n!=1*2*3*4*------*n
    def fact(n):
        if n == 1:
            return 1
        else:
            return n * fact(n-1)
    
    #   2:        :    dict  key    ,        set   
    def dict_to_set(dict_ob,set_ob):
        for key, value in dict_ob.items():
            set_ob.add(key)
            if isinstance(value, dict):
                dict_to_set(value, set_ob)
            elif isinstance(value, list):
                for li in value:
                    dict_to_set(li,set_ob)
        return set_ob
    if __name__ == "__main__":
        dict01 = {"name":"ting","pass":"123","family":[{"name":"tian","age":1},{"name":"zhou","age":26}]}
        my_set = set()
        print(dict_to_set(dict01,my_set)) #   :{'name', 'pass', 'family', 'age'}
    
    

    여기 서 나 는 구 덩이 를 기록 했다. 어제 나 는 빠 졌 다.
    #   3:         ,         2
    def dict_to_set(dict_ob,set_ob):
        for key, value in dict_ob.items():
            set_ob.add(key)
            if isinstance(value, dict):
                return dict_to_set(value, set_ob)
            elif isinstance(value, list):
                for li in value:
                    return dict_to_set(li,set_ob)
        return set_ob
    if __name__ == "__main__":
        #   :  
        dict01 = {"name":"ting","pass":"123","family":[{"name":"tian","age":1},{"name":"zhou","age":26}],"friend":[{"name":"yaya","age":21]},{"name":"ayu","age":12}}
        my_set = set()
        print(dict_to_set(dict01,my_set))
    
    

    설명: 우리 의 첫 번 째 예 에서 호출 자 체 는 return 키 워드 를 사 용 했 고 뒤의 예 에서 우 리 는 for 순환 을 사 용 했 습 니 다. return dict to set (,) 를 사용 할 수 없습니다. return 이후 for 순환 이 끝나 지 않 은 것 은 계속 실행 되 지 않 기 때 문 입 니 다.
    마지막 에 쓰 면.
    정말 난처 하 다. 나 는 어제 이 몇 줄 의 코드 를 쓰 는 데 한 시간 이 걸 렸 다. 원래 우리 집 그분 께 가르침 을 청 하려 고 했 는데, 나 로 하여 금 스스로 해결 방법 을 생각 하 게 했다. 그렇지 않 으 면 영원히 할 수 없 을 것 이다. 나 는 말 이 이치 에 맞는다 고 생각한다. 다행히 나 는 그래도 썼 다.

    좋은 웹페이지 즐겨찾기