一 递归

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基础之递归、二分法的更多相关文章

  1. 十四. Python基础(14)--递归

    十四. Python基础(14)--递归 1 ● 递归(recursion) 概念: recursive functions-functions that call themselves either ...

  2. python基础----递归函数(二分法、最大深度递归)

    递归函数 定义:在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. #例子1 # age()=age()+ n= age(n)=age(n-)+ # age()=ag ...

  3. python之路--递归, 二分法

    一 . 递归 自己调用自己, 递归的入口(参数)  和  出口(return),  树形结构的遍历. def func(): print("我是递归") func() func() ...

  4. python基础之递归,匿名,内置函数

    递归函数: 什么是递归函数? 函数递归调用:在调用一个函数的过程中,又直接或间接地调用了该函数本身. 递归必须要有两个明确的阶段: ①递推:一层一层递归调用下去,强调:每进入下一层问题规模减少 ②回溯 ...

  5. python基础之递归,声明式编程,面向对象(一)

    在函数内部,可以调用其他函数,如果一个函数在内部调用自身本身,这个函数就是递归函数.递归效率低,需要在进入下一次递归时保留当前的状态,解决方法是尾递归,即在函数的最后一步(而非最后一行)调用自己,但是 ...

  6. python基础-函数递归

    函数递归 概念:直接或间接地重复调用函数本身,是一种函数嵌套调用的表现形式. 直接调用:在函数内部,直接调用函数本身 def foo(): print("这是foo函数") foo ...

  7. Python 基础之递归 递归函数 尾递归 斐波那契

    1.递归函数 定义:自己调用自己的函数递:去归:回有去有回是递归#(1)简单的递归函数def digui(n):    print(n)    if n > 0:        digui(n- ...

  8. 【python基础】第19回 多层,有参装饰器 递归 二分法

    本章内容概要 1. 多层装饰器 2. 有参装饰器 3. 递归函数 4. 算法(二分法) 本章内容详解 1. 多层装饰器 1.1 什么是多层装饰器 多层装饰器是从下往上依次执行,需要注意的是,被装饰的函 ...

  9. Python基础(协程函数、内置函数、递归、模块和包)-day05

    写在前面 上课第五天,打卡: 凭着爱,再回首: 一.协程函数(生成器:yield的表达式形式) 1.yield 的语句形式: yield 1 - 这种方式在 Python基础(函数部分)-day04  ...

随机推荐

  1. CentOS显示设置时间命令- date

    概要: date命令的功能是显示和设置系统日期和时间 命令格式: date [OPTION]... [+FORMAT]date [-u|--utc|--universal] [MMDDhhmm[[CC ...

  2. memcached +mysql+php 例子

    <?php header("content-type:text/html;charset=utf-8"); $memcachehost = '127.0.0.1'; $mem ...

  3. glsl 多重纹理

    #include"glsl.h" void SHADER::drawBox() { glBegin(GL_QUADS); // Front Face glNormal3f( 0.0 ...

  4. Linux使用expect实现自动登录的脚本

    前提条件服务器已经安装过tcl和expect, 若未安装:可以先执行 yum  install tcl  expect  进行安装 第一步.编写以下自动登录脚本login.sh ########### ...

  5. spring如何引用properties文件里的配置

      1.PropertyPlaceholderConfigurer类它是把属性中的定义的变量(var)替代,spring的配置文件中使用${var}的占位符 <beans><bean ...

  6. python--数据类型--1

    原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 视频教程::http://www.imooc.com/learn/177 http://www. ...

  7. [ML] I'm back for Machine Learning

    Hi, Long time no see. Briefly, I plan to step into this new area, data analysis. In the past few yea ...

  8. Cocos2d-x3.0终于版Mac以及Win系统相关环境部署

    因个人原因此博客停止更新,其它更新博文将在该博客继续更新. http://blog.csdn.net/xiaohan_aimti/article/details/24653831 就在前几天,2014 ...

  9. Python IDLE背景设置与使用

    相信刚进入python学习之路的朋友们,都还是挺喜欢python自带的IDLE,但是白的代码背景色以及其它的代码色确实让人看着有点不舒服,所以当时也琢磨着能不能自己给它换换颜色,这个当然可以,废话不多 ...

  10. TextSwitcher实现文本自动垂直滚动

    实现功能:用TextSwitcher实现文本自动垂直滚动,类似淘宝首页广告条. 实现效果: 注意:由于网上横向滚动的例子比较多,所以这里通过垂直的例子演示. 实现步骤:1.extends TextSw ...