递归(1)

本文介绍了递归的执行过程,通过二分查找算法和计算目录磁盘使用情况的例子详细阐述了递归的概念。递归在每次调用中会减少问题规模,如二分查找的时间复杂度为O(logn),而计算目录磁盘使用情况的递归函数时间复杂度为O(n)。
摘要由CSDN通过智能技术生成

1.递归执行过程:如果一个函数的执行导致嵌套函数的调用,那么前者调用的执行将会挂起,其活动记录(每当一个函数被调用时都会创建一个活动记录,用来存储其调用的参数和局部变量的命名空间,以及这个函数当前正在执行的命令的信息)将存储源代码中的位置,这个位置是被调用函数返回后将继续执行的控制流。

2.例1:二分查找算法

def binary_search(data, target, low, high):
    if low > high:
        return False 
    mid = (high + low) // 2
    if data[mid] == target:
        return True
    elif data[mid] > target:
        return binary_search(data, target, low, mid-1)
    else:
        return binary_search(data, target, mid+1, high)

    

该查找算法会一直迭代下去到函数返回True或者False为止,然后将结果一直传递,传递给最初调用的函数作为最后的结果,每一次递归之后,需要被查找的候选条目数至少减少了一半,其时间复杂度为O(logn)

例2:计算嵌套在一个特定目录中的所有文件和目录的总磁盘使用情况(思路:一个目录的总磁盘空间为该目录所使用的即时磁盘空间和其下所嵌套目录的累计磁盘空间)

import os

def disk_usage(path):
    total = os.path.getsize(path)
    if os.path.isdir(path):
        for filename in os.path.dirlist(path):
            childpath = os.path.join(path, filename)
            total += disk_usage(childpath)
    
    print('{0:<7}'.format(total), path)
    return total

递归执行时,函数的活动记录存储在print函数之上的位置,print函数的执行与递归函数调用的顺序是刚好相反的。显然该函数有O(n)次递归调用,每次递归调用在循环外部使用O(1)的时间,并且循环操作的总数是O(n),所以这个函数的时间复杂度为O(n)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值