1 2 3 4

【python之路23】递归及二分法查找

 

 

1、递归的基础

举例说明:老师要班里坐在最后的一排学生要一本书,老师对前面的人说你向最后一排的同学要一本书,那么最前面的人跟坐在第2排的人说,第2排的人跟第3排的人说,当命令传递到最后一排时,最后一排的同学给倒数第2排的人,倒数第2排的人,给倒数第3排的人,直到传递给第1排,第1排的同学把书给老师。

2、递归斐波那契数列

#!usr/bin/env python
# -*- coding:utf-8 -*-
#递归 斐波那契数列
def fab(n1,n2):
    if n1 > 10000:
        return
    print(n1)
    temp = n1 + n2
    fab(n2,temp)

fab(0,1)

 3、递归过程返回值分析

#!usr/bin/env python
# -*- coding:utf-8 -*-
def f4(n):
    if n == 5:
        return 200
    r = f4(n+1)
    return r

print(f4(1))

执行过程如下图:

 4、递归求斐波那契数列的第10个值

#!usr/bin/env python
# -*- coding:utf-8 -*-
def fab(n,a1,a2):
    if n == 10:
        return a1
    a3 = a1 + a2
    r = fab(n+1,a2,a3)
    return r

re = fab(1,0,1)
print(re)

 

5、利用递归读取目录下的所有文件夹和文件

 

#通过递归将目录下所有的文件及文件夹进行打印
import os
mypath = 'D:\\project\\untitled1'


def func(my_path,n):
    dirlist = os.listdir(my_path)  #读取目录列表
    for el in dirlist:
        el_path = os.path.join(my_path,el)  #连接目录和文件
        if os.path.isdir(el_path):   #判断是否为目录
            print('\t' * n, el)
            func(el_path,n+1)
        else:
            print('\t'*n,el)

func(mypath,0)

 

 

6、二分法查找

 1)二分法查找的条件是:序列有序排序

li = list(range(10000000))
print("开始查找.........")
num = 50000
left = 0
right = len(li)-1
count = 0   #记录找了多少次

while left <= right:
    count = count + 1
    middle = (left + right) // 2
    if num > li[middle]:
        left = middle + 1
    elif num < li[middle]:
        right = middle - 1
    else:
        print(middle)
        break
else:
    print("没有找到这个数")
print('一共找了%s次' % count)

 2)递归的方式实现二分查找

lis = [11, 22, 33, 44, 55, 66, 77, 88, 99]


def func(left, right, num, li):
    middle = (left + right) // 2
    if num > li[middle]:
        left = middle + 1
    elif num < li[middle]:
        right = middle - 1
    else:
        return middle
    re = func(left, right, num, li)
    return re


result = func(0, len(lis) - 1, 88, lis)
print(result)

 

posted @ 2017-02-11 10:29  I我的博客I  阅读(334)  评论(0编辑  收藏  举报