python基础之递归、二分法
一 递归
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==:
return
if num>:
return func(num-)*num
k = func()
print(k) #最后k等于120 def func():
if ==:
return
if >:
return func()* #返回时func() 等于 , func()* def func():
if ==:
return
if >:
return func()* #返回时func() 等于 , func()* 等于 def func():
if ==:
return
if >:
return func()* #返回时func() 等于 , func()* 等于 def func():
if ==:
return
if >:
return func()* #返回时func() 等于 , func()* 等于 def func():
if ==:
return #最终得出结论func() 等于 ,开始返回
"""
使用实例:
猜年龄游戏:
小白问小黄年龄多少,小黄说比小蓝大两岁。又问小蓝年龄多少,小蓝说比小红大两岁。
又问小红年龄多少,小红说比小绿大两岁。又问小绿年龄多少,小绿说比小青大两岁。、
又问小青多大,小青说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基础之递归、二分法的更多相关文章
- 十四. Python基础(14)--递归
十四. Python基础(14)--递归 1 ● 递归(recursion) 概念: recursive functions-functions that call themselves either ...
- python基础----递归函数(二分法、最大深度递归)
递归函数 定义:在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. #例子1 # age()=age()+ n= age(n)=age(n-)+ # age()=ag ...
- python之路--递归, 二分法
一 . 递归 自己调用自己, 递归的入口(参数) 和 出口(return), 树形结构的遍历. def func(): print("我是递归") func() func() ...
- python基础之递归,匿名,内置函数
递归函数: 什么是递归函数? 函数递归调用:在调用一个函数的过程中,又直接或间接地调用了该函数本身. 递归必须要有两个明确的阶段: ①递推:一层一层递归调用下去,强调:每进入下一层问题规模减少 ②回溯 ...
- python基础之递归,声明式编程,面向对象(一)
在函数内部,可以调用其他函数,如果一个函数在内部调用自身本身,这个函数就是递归函数.递归效率低,需要在进入下一次递归时保留当前的状态,解决方法是尾递归,即在函数的最后一步(而非最后一行)调用自己,但是 ...
- python基础-函数递归
函数递归 概念:直接或间接地重复调用函数本身,是一种函数嵌套调用的表现形式. 直接调用:在函数内部,直接调用函数本身 def foo(): print("这是foo函数") foo ...
- Python 基础之递归 递归函数 尾递归 斐波那契
1.递归函数 定义:自己调用自己的函数递:去归:回有去有回是递归#(1)简单的递归函数def digui(n): print(n) if n > 0: digui(n- ...
- 【python基础】第19回 多层,有参装饰器 递归 二分法
本章内容概要 1. 多层装饰器 2. 有参装饰器 3. 递归函数 4. 算法(二分法) 本章内容详解 1. 多层装饰器 1.1 什么是多层装饰器 多层装饰器是从下往上依次执行,需要注意的是,被装饰的函 ...
- Python基础(协程函数、内置函数、递归、模块和包)-day05
写在前面 上课第五天,打卡: 凭着爱,再回首: 一.协程函数(生成器:yield的表达式形式) 1.yield 的语句形式: yield 1 - 这种方式在 Python基础(函数部分)-day04 ...
随机推荐
- php将汉字转换为拼音和得到词语首字母(一)
<?php /** * 修复二分法查找方法 * 汉字拼音首字母工具类 * 注: 英文的字串:不变返回(包括数字) eg .abc123 => abc123 * 中文字符串:返回拼音首字符 ...
- CSS background 之设置图片为背景技巧
首先先来看看background有那些值: 可以按顺序设置如下属性(可点击进入相应的css手册查看使用):background-color 背景颜色background-image 背景图片backg ...
- brew 的 调度工具DBGPRINTF 和 c语言的 printf
在官方的文档中是这样备注DBGPRINTF Prototype void dbgprintf(const char *pszFormat,...); Description This function ...
- List 和 ObservableCollection的区别
在WPF中绑定一个集合的时候,比如:DataGrid.ItemsSource = new List<T>(); 这样的操作,会存在当数据行新增或者删除的时候不会得到及时的通知来刷新界面,而 ...
- android中用studio更改包名
Android Studio,咱们开发安卓的利器,自推出就受到移动开发者的追捧,但一路走来,大家谈到他,充满了兴奋之情之余,也略显羞涩.随版本自推出以来,不断完善BUG,但咱们还是深深地踩了进去,说多 ...
- 《C++ Primer Plus》第13章 类继承 笔记
类继承通过使用已有的类(基类)定义新的来(派生类),使得能够根据需要修改编程代码.共有继承建立is-a关系,这意味着派生类对象也应该是某种基类对象.作为is-a模型的一部分,派生类继承基类的数据称源和 ...
- Runtime应用(二)使用对象关联为分类增加属性(每个对象的属性互不干扰)
一.对象的关联方法有 1. void objc_setAssociatedObject(id object, const void *key, id value,objc_AssociationPol ...
- Spring 工作流程简单介绍
Spring Web MVC 处理Http请求的大致过程: 一旦Http请求到来,DispatcherSevlet将负责将请求分发. DispatcherServlet可以认为是Spring提供的前端 ...
- linux IP 设置
修改ip地址即时生效:# ifconfig eth0 192.168.1.102 netmask 255.255.255.0启动生效:修改/etc/sysconfig/network-scripts/ ...
- golang 小知识-持续更新中
Golang 中的指针 - Pointer Go 的原生数据类型可以分为基本类型和高级类型,基本类型主要包含 string, bool, int 及 float 系列,高级类型包含 struct,ar ...