一、 什么是函数递归调用
    函数的递归调用是函数嵌套调用的一种特殊形式,在调用一个函数的过程中又直接或者间接地调用该函数
    本身,称之为函数的递归调用

    递归调用必须有两个明确的阶段:
        1. 回溯: 一次次递归调用下去,说白了就一个重复的过程,但需要注意的是每一次重复问题的规模都应该有所减少,直到逼近一个最终的结果,即回溯阶段一定要有一个明确的结束条件
        2. 递推: 往回一层一层推算出结果

import sys
print(sys.getrecursionlimit())
sys.setrecursionlimit(2048)
def foo(n):
    print('from foo',n)
    foo(n+1)
foo(0)
def bar():
    print('from bar')
    foo()
def foo():
    print('from foo')
    bar()
foo()
age(5)=age(4)+2
age(4)=age(3)+2
age(3)=age(2)+2
age(2)=age(1)+2
age(1)=18
age(n)=age(n-1)+2 #n>1
age(n)=18         #n=1

# 递归调用就是一个重复的过程,但是每一次重复问题的规模都应该有所减少,并且应该在满足某种条件的情况下结束重复,开始进入递推阶段

def age(n):
    if n == 1:
        return 10
    return age(n-1) + 2
print(age(5))
-------------------------------------------
18
l=[1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,]]]]]]]]]]]
def search(l):
    for item in l:
        if type(item) is not list:
            # 不是列表直接打印
            print(item)
        else:
            # 判断是列表则继续循环,判断...
            search(item)
search(l)
----------------------------------------------------------
1
2
3
4
5
6
7
8
9
10
11

算法:是如何高效率地解决某一个问题的方法/套路
# 二分法

nums=[13,15,17,23,31,53,74,81,93,102,103,201,303,403,503,777]
find_num=503

def binary_search(nums,find_num):
    print(nums)
    if len(nums) == 0:
        print('not exists')
        return
    mid_index=len(nums) // 2
    if find_num > nums[mid_index]:
        # in the right
        nums=nums[mid_index+1:]   # 切一半
        # 重新执行二分的逻辑
        binary_search(nums,find_num)
    elif find_num < nums[mid_index]:
        #in the left
        nums=nums[0:mid_index]
        # 重新执行二分的逻辑
        binary_search(nums,find_num)
    else:
        print('find it')

# binary_search(nums,find_num)
binary_search(nums,94)
---------------------------------------------