函数的递归、尾递归

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)

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

原文地址:https://www.cnblogs.com/jgua/p/13502861.html