一、 什么是函数递归调用
函数的递归调用是函数嵌套调用的一种特殊形式,在调用一个函数的过程中又直接或者间接地调用该函数
本身,称之为函数的递归调用
递归调用必须有两个明确的阶段:
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)
---------------------------------------------