一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - python中尾遞歸用法實例詳解

python中尾遞歸用法實例詳解

2020-06-15 09:44feiwen Python

這篇文章主要介紹了python中尾遞歸用法,較為詳細的分析了尾遞歸原理與相關使用技巧,非常具有實用價值,需要的朋友可以參考下

本文實例講述了python中尾遞歸用法。分享給大家供大家參考。具體分析如下:

如果一個函數中所有遞歸形式的調用都出現在函數的末尾,我們稱這個遞歸函數是尾遞歸的。當遞歸調用是整個函數體中最后執行的語句且它的返回值不屬于表達式的一部分時,這個遞歸調用就是尾遞歸。尾遞歸函數的特點是在回歸過程中不用做任何操作,這個特性很重要,因為大多數現代的編譯器會利用這種特點自動生成優化的代碼。

原理:

當編譯器檢測到一個函數調用是尾遞歸的時候,它就覆蓋當前的活躍記錄而不是在棧中去創建一個新的。編譯器可以做到這點,因為遞歸調用是當前活躍期內最后一條待執行的語句,于是當這個調用返回時棧幀中并沒有其他事情可做,因此也就沒有保存棧幀的必要了。通過覆蓋當前的棧幀而不是在其之上重新添加一個,這樣所使用的棧空間就大大縮減了,這使得實際的運行效率會變得更高。因此,只要有可能我們就需要將遞歸函數寫成尾遞歸的形式.

代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# This program shows off a python decorator(
# which implements tail call optimization. It
# does this by throwing an exception if it is
# it's own grandparent, and catching such
# exceptions to recall the stack.
import sys
class TailRecurseException:
 def __init__(self, args, kwargs):
  self.args = args
  self.kwargs = kwargs
def tail_call_optimized(g):
 """
 This function decorates a function with tail call
 optimization. It does this by throwing an exception
 if it is it's own grandparent, and catching such
 exceptions to fake the tail call optimization.
 This function fails if the decorated
 function recurses in a non-tail context.
 """
 def func(*args, **kwargs):
  f = sys._getframe()
  if f.f_back and f.f_back.f_back and f.f_back.f_back.f_code == f.f_code:
   raise TailRecurseException(args, kwargs)
  else:
   while 1:
    try:
     return g(*args, **kwargs)
    except TailRecurseException, e:
     args = e.args
     kwargs = e.kwargs
 func.__doc__ = g.__doc__
 return func
@tail_call_optimized
def factorial(n, acc=1):
 "calculate a factorial"
 if n == 0:
  return acc
 return factorial(n-1, n*acc)
print factorial(10000)
# prints a big, big number,
# but doesn't hit the recursion limit.
@tail_call_optimized
def fib(i, current = 0, next = 1):
 if i == 0:
  return current
 else:
  return fib(i - 1, next, current + next)
print fib(10000)
# also prints a big number,
# but doesn't hit the recursion limit.

希望本文所述對大家的Python程序設計有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色菇凉天天综合网 | www.亚洲视频| 红杏劫| ange venus与黑人 | 国产午夜永久福利视频在线观看 | 免费人成在线观看 | 国产免费资源高清小视频在线观看 | 全肉一女n男np高h双龙养成 | 国产精品一级香蕉一区 | 帅老头恋帅老头同性tv | 草逼吧 | 成人动漫影院 | 91免费高清无砖码区 | 春色视频网站 | 国产精品毛片久久久久久久 | 日本视频在线播放 | 亚州笫一色惰网站 | 校花在公车上被内射好舒服 | 欧美同志video 在线观看 | 天天插在线视频 | 无限资源在线观看播放 | 久久青草费线频观看国产 | 亚洲第一二三四区 | 日本一区二区三区在线 观看网站 | 肉车各种play文r | 丝袜捆绑调教视频免费区 | 91精品国产91久久久久久 | 狠狠燥 | 草莓丝瓜芭乐樱桃榴莲色多黄 | 免费国产午夜高清在线视频 | www.色婷婷.com| 国产精品欧美日韩一区二区 | 日韩精品视频免费 | 免费在线视频网站 | 欧美一级在线视频 | 青青青在线观看国产精品 | 妇乱子伦激情 | 爱色成人网 | 欧美日韩中文字幕久久伊人 | 久久伊人久久 | 亚洲欧美日韩天堂 |