고급 기능 - 재귀

재귀 함수 란 다이애나

중첩 된 통화 기능은 다음과 같습니다 기능 중첩 된 기능. 이 중첩 된 호출의 특별한 종류이지만, 프로세스의 함수를 호출하고, 직접 또는 간접적으로 자신을 호출 : 재귀 함수를 호출합니다.

def foo():
    print('from foo')
    foo()

foo()  # 进入死循环

재귀 함수 끊임없이 함수 자체를 호출하면,이 재귀 함수는 무한 루프를 입력합니다, 그래서 우리는 분명 재귀 함수의 종료 조건을 제공해야합니다.

1.1 직접 전화

직접 호출은 의미 : 함수 자체 내에서 직접 통화 기능을.

import sys

print(f"最大递归层数: {sys.getrecursionlimit()}")

最大递归层数: 3000

import sys

# 修改递归层数
sys.setrecursionlimit(10000)
def foo(n):
    print('from foo',n)
    foo(n+1)
foo(0)

1.2 간접 호출

간접 호출 수단 : 생체 기능 자체가 원래 함수를 호출하지 않지만, 다른 간접적 인 방식을 통해 함수 자체 전화.

def bar():
    print('from bar')
    foo()
    
def foo():
    print('from foo')
    bar()
    
bar()

재귀는 두 가지 단계가 있어야합니다 :

 * 재귀 : 레이어에 의해 재귀 호출 아래 층 재귀의 다음 단계로는 문제의 규모 줄일 수
 * 백 : 명확한 재귀 종료 조건이 있어야합니다, 조건은 시작하는 층으로이면 층에 만족한다.
본질은이 지속적으로 순환 방식에게 최종 결과를 반복하여. !!!!!

'''
...
age(5) = age(4) + 2
age(4) = age(3) + 2
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 26


age(n) = age(n-1) +2 
age(1) = 26  # n=1
'''


def age(n):
    if n == 1:
        return 26
    res = age(n-1) + 2
    return res


print(f"age(5): {age(5)}")

age(5): 34


왜이 재귀 다이애나를 사용

순환 특성은 특정 결과를 얻은 후 복귀 한 후, while 루프에 각각 순환은 최종 결과에 근접한다 비해, 반복 작업을하고

lis = [1, [2, [3, [4, [5, [6, ]]]]]]

def tell(lis):
    for i in lis:
        if type(i) is list:
            tell(i)
        else:
            print(i)

# print(f"tell(lis): {tell(lis)}")
tell(lis)

1 2 3 4 5 6


어떻게 물과 재귀
조회 숫자 예 :

nums = [1, 3, 7, 11, 22, 34, 55, 78, 111, 115]

for item in nums:
    if item == 10:
        print('find it')
        break
else:
    print('not exists')

not exists
위의 목록은 우리는 우리가 for 루프를 통해 필요한 기능을 달성 할 수있을 수 있지만, 우리의 목록에있는 요소의 개수가 매우 긴 경우, 우리는 또한 매우 복잡,이 방법을 사용, 그래서 우리는 이분법의 사용을 고려할 수 있습니다 아이디어의 실현.

from random import randint
nums = [randint(1, 100) for i in range(100)]
nums = sorted(nums)
print(nums)

[1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 10, 11, 11, 11, 11, 12, 13, 13, 15, 16, 16, 20, 21, 21, 23, 24, 26, 26, 27, 28, 28, 31, 33, 33, 34, 35, 38, 38, 39, 40, 42, 43, 45, 45, 46, 46, 47, 47, 51, 52, 52, 53, 53, 55, 55, 56, 56, 57, 57, 57, 58, 59, 61, 62, 64, 66, 66, 67, 68, 69, 69, 71, 72, 72, 74, 74, 75, 76, 78, 78, 79, 79, 79, 79, 80, 82, 85, 88, 89, 90, 90, 91, 91, 91, 94, 99, 99, 100]

def search(search_num, nums):
    mid_index = len(nums)//2
    print(nums)
    if not nums:
        print('not exists')
        return
    if search_num > nums[mid_index]:
        # in the right
        nums = nums[mid_index+1:]
        search(search_num, nums)
    elif search_num < nums[mid_index]:
        # in the left
        nums = nums[:mid_index]
        search(search_num, nums)
    else:
        print('find it')

search(7, nums)

[1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 10, 11, 11, 11, 11, 12, 13, 13, 15, 16, 16, 20, 21, 21, 23, 24, 26, 26, 27, 28, 28, 31, 33, 33, 34, 35, 38, 38, 39, 40, 42, 43, 45, 45, 46, 46, 47, 47, 51, 52, 52, 53, 53, 55, 55, 56, 56, 57, 57, 57, 58, 59, 61, 62, 64, 66, 66, 67, 68, 69, 69, 71, 72, 72, 74, 74, 75, 76, 78, 78, 79, 79, 79, 79, 80, 82, 85, 88, 89, 90, 90, 91, 91, 91, 94, 99, 99, 100] [1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 10, 11, 11, 11, 11, 12, 13, 13, 15, 16, 16, 20, 21, 21, 23, 24, 26, 26, 27, 28, 28, 31, 33, 33, 34, 35, 38, 38, 39, 40, 42, 43, 45, 45, 46, 46, 47, 47] [1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 10, 11, 11, 11, 11, 12, 13, 13, 15, 16, 16, 20, 21] [1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7] [6, 6, 7, 7, 7] find it

추천

출처www.cnblogs.com/suren-apan/p/11374770.html