python基础之递归、二分法
2017-04-14 14:11
302 查看
一 递归
1. 必须有一个明确的结束条件2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,
函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,
栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,
所以,递归调用的次数过多,会导致栈溢出)
注:栈遵循先进后出,先吃后拉原则。
递归能干得事,while True都能干。
查看和修改栈的大小:
>>> import sys >>> sys.getrecursionlimit() 1000 >>> >>> sys.setrecursionlimit(10000) >>> sys.getrecursionlimit() 10000 >>>
递归初识:
part1:
def test(): test() test()
输出结果:
#part2:
#:有一个明确的结束条件 def test(n): print(n) n = n -1 if n >=1: test(n) test(5)
输出结果:
#part3
def calc(n): print(n) if int(n/2)==0: return n return calc(int(n/2)) print('********',calc(10))
输出结果:
#part4
# 5 = 5*4*3*2*1(实现阶乘)
def func(num): if num==1: return 1 if num>1: return func(num-1)*num k = func(5) print(k)
输出结果:
分析过程:
"""
def func(num): if num==1: return 1 if num>1: return func(num-1)*num k = func(5) print(k) #最后k等于120
def func(5):
if 5==1:
return 1
if 5>1:
return func(4)*5 #返回时func(4) 等于 24 , func(4)*5
def func(4):
if 4==1:
return 1
if 4>1:
return func(3)*4 #返回时func(3) 等于 6 , func(3)*4 等于 24
def func(3):
if 3==1:
return 1
if 3>1:
return func(2)*3 #返回时func(2) 等于 2 , func(2)*3 等于 6
def func(2):
if 2==1:
return 1
if 2>1:
return func(1)*2 #返回时func(1) 等于 1 , func(1)*2 等于 2
def func(1):
if 1==1:
return 1 #最终得出结论func(1) 等于 1,开始返回
"""
使用实例:
猜年龄游戏:
小白问小黄年龄多少,小黄说比小蓝大两岁。又问小蓝年龄多少,小蓝说比小红大两岁。
又问小红年龄多少,小红说比小绿大两岁。又问小绿年龄多少,小绿说比小青大两岁。、
又问小青多大,小青说10岁了。问小黄现在多大?
分析:
age(5)=age(4)+2 n=5 age(n)=age(n-1)+2
age(4)=age(3)+2 n=4 age(n)=age(n-1)+2
age(3)=age(2)+2 n=3 age(n)=age(n-1)+2
age(2)=age(1)+2 n=2 age(n)=age(n-1)+2
age(1)=10 n=1 age(n)=10
n=1 res=10
n>1 res=age(n-1)+2
答案:
def age(n): if n == 1: return 10 else: return age(n-1)+2 print(age(5))
二 二分法
猜数字是否在列表内游戏:# data=[] # for i in range(1,100000,2): # data.append(i) data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35] # num=19 # i=0 # while True: # if num == data[i]: # print('find it') # break # i+=1 def search(num,data): print(data) if len(data) > 1: #二分 mid_index=int(len(data)/2) mid_value=data[mid_index] if num > mid_value: #19>18 #num在列表的右边 data=data[mid_index:] #data[0:]-->[18] search(num,data) elif num < mid_value: #num在列表的左边 data=data[:mid_index] search(num,data) else: print('find it') return else: if data[0] == num: print('find it') else: print('not exists') # search(9527,data) search(15,data) # search(1,data)
相关文章推荐
- python基础-递归、二分法查找(for\递归)、三级菜单、压栈思想
- python基础----递归函数(二分法、最大深度递归)
- 递归实现二分法查找----python
- Python菜鸟之路:Python基础-生成器和迭代器、递归
- Python基础教程--抽象,函数,参数,递归,作用域
- python基础-08-内置函数、作用域、闭包、递归
- 递归调用输出元素 分类: python 小练习 python基础学习 2013-06-30 11:54 278人阅读 评论(0) 收藏
- python基础练习--利用递归方法求阶乘!
- Python基础之内置函数和递归
- Python基础(10)_内置函数、匿名函数、递归
- Python基础知识7:生成器和迭代器、递归
- python 二分法查找实例(递归、循环)
- 第七篇 python基础之函数,递归,内置函数
- 详谈Python基础之内置函数和递归
- Python基础(协程函数、内置函数、递归、模块和包)-day05
- python 中的一些基础算法:递归/冒泡/选择/插入
- Python基础----二分法查找
- 020--python函数基础知识考试(包括:函数_递归等知识)
- Python基础3 函数、递归、内置函数
- python基础(07)——递归,lambda表达式,数学函数