zoukankan      html  css  js  c++  java
  • 【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('	' * n, el)
                func(el_path,n+1)
            else:
                print('	'*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)
  • 相关阅读:
    优秀 Java 程序员写代码的风格
    最新!Apache Struts 又爆安全漏洞(危害程度特别大)
    Spring bean初始化及销毁你必须要掌握的回调方法
    Shiro Realm 权限的验证流程和缓存机制
    国人开源了一款小而全的 Java 工具类库,厉害啊!!
    Spring 解决循环依赖的 3 种方式!
    图解高内聚与低耦合,傻瓜都能看懂!
    五分钟搞懂 Linux 重点知识,傻瓜都能学会!
    微信扫码登录是如何实现的?
    shell实现group by聚合操作统计
  • 原文地址:https://www.cnblogs.com/sunshuhai/p/6388754.html
Copyright © 2011-2022 走看看