• 函数的递归、尾递归


    1递归函数

        递归的特性

      (1)必须有一个明确的结束条件 (在函数中,执行 return操作就代表着函数结束,类似于while循环中的 break)

      (2)每次进入更深一层的递归时,问题规模相比上次递归都应有所减少

      (3)递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用时通过栈(stack)这种数据结构实现的每当进入一个函数调用,栈就会增加一层栈帧,

         每当函数返回,栈就会减一层栈帧。  由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

    问路问题:

    person_list = ['alex','wupeiqi','yuanhao','lihaifeng','zbc'] def ask_way(person_list): if len(person_list) == 0: return '根本没人知道' person = person_list.pop(0) if person == 'lihaifeng': return '%s说,我知道,老男孩就在沙河汇德商厦,下地铁就是' %person print('hi 美男 %s ,敢问路在何方' % person) print('%s 回答到:我不知道,但念你慧眼识珠,你等着,我帮你问%s...' %(person ,person_list[0])) res = ask_way(person_list) print('%s 问的结果是: %s' %(person,res)) return res res=ask_way(person_list) print(res) 运行结果: hi 美男 alex ,敢问路在何方 alex 回答到:我不知道,但念你慧眼识珠,你等着,我帮你问wupeiqi... hi 美男 wupeiqi ,敢问路在何方 wupeiqi 回答到:我不知道,但念你慧眼识珠,你等着,我帮你问yuanhao... hi 美男 yuanhao ,敢问路在何方 yuanhao 回答到:我不知道,但念你慧眼识珠,你等着,我帮你问lihaifeng... yuanhao 问的结果是: lihaifeng说,我知道,老男孩就在沙河汇德商厦,下地铁就是        最后一层递归获得res,并执行随后的语句,print('%s 问的结果是: %s' %(person,res),因此得到此行这句话,并执行后面的return res ,
    wupeiqi 问的结果是: lihaifeng说,我知道,老男孩就在沙河汇德商厦,下地铁就是         使上一次递归获得结果并执行后面的语句,得到此行的这句话,并执行后面的 return res
    alex 问的结果是: lihaifeng说,我知道,老男孩就在沙河汇德商厦,下地铁就是         使上一次递归获得结果并执行后面的语句,得到此行这句话,并执行后面的 return res ,整个ask_way(person_list)完成
    lihaifeng说,我知道,老男孩就在沙河汇德商厦,下地铁就是  
    
    
    def calc(n):
        print(n)
        if int(n / 2) == 0:
            return n
    
        res = calc(int(n / 2))
        return res
    
    
    calc(10)
    运行结果:
    10
    5
    2
    1

       由于递归的特性、运用递归函数时,可能会小号大量内存、且效率低

    2.尾调用 (尾递归 ) :在函数的最后一步调用一个函数 (最后一步不一定是最后一行)

      (1)函数bar在foo内为尾调用

    def bar(n):
        return n
    
    def foo(x):
        return bar(x)

      尾递归能够节省内存,因为如果调用函数放在最后一步,内存会把函数内之前运行完的清除。而普通递归要等递归完成返回值后,继续运行后面的代码直至完成才会在内存中删除。

  • 相关阅读:
    timeout in asp.net
    ASP.NET_SessionId vs .ASPXAUTH why do we need both of them?
    Visual paradigm软件介绍
    OJ网站程序员必备
    c++异常详解
    C++STL之双端队列容器
    GPU的线程模型和内存模型
    C++ 中memset 勿要对类使用
    trait与policy模板技术
    C++标准库
  • 原文地址:https://www.cnblogs.com/jgua/p/13502861.html
Copyright © 2020-2023  润新知