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

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類(lèi)導(dǎo)航

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

服務(wù)器之家 - 腳本之家 - Python - python中尾遞歸用法實(shí)例詳解

python中尾遞歸用法實(shí)例詳解

2020-06-15 09:44feiwen Python

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

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

如果一個(gè)函數(shù)中所有遞歸形式的調(diào)用都出現(xiàn)在函數(shù)的末尾,我們稱這個(gè)遞歸函數(shù)是尾遞歸的。當(dāng)遞歸調(diào)用是整個(gè)函數(shù)體中最后執(zhí)行的語(yǔ)句且它的返回值不屬于表達(dá)式的一部分時(shí),這個(gè)遞歸調(diào)用就是尾遞歸。尾遞歸函數(shù)的特點(diǎn)是在回歸過(guò)程中不用做任何操作,這個(gè)特性很重要,因?yàn)榇蠖鄶?shù)現(xiàn)代的編譯器會(huì)利用這種特點(diǎn)自動(dòng)生成優(yōu)化的代碼。

原理:

當(dāng)編譯器檢測(cè)到一個(gè)函數(shù)調(diào)用是尾遞歸的時(shí)候,它就覆蓋當(dāng)前的活躍記錄而不是在棧中去創(chuàng)建一個(gè)新的。編譯器可以做到這點(diǎn),因?yàn)檫f歸調(diào)用是當(dāng)前活躍期內(nèi)最后一條待執(zhí)行的語(yǔ)句,于是當(dāng)這個(gè)調(diào)用返回時(shí)棧幀中并沒(méi)有其他事情可做,因此也就沒(méi)有保存棧幀的必要了。通過(guò)覆蓋當(dāng)前的棧幀而不是在其之上重新添加一個(gè),這樣所使用的棧空間就大大縮減了,這使得實(shí)際的運(yùn)行效率會(huì)變得更高。因此,只要有可能我們就需要將遞歸函數(shù)寫(xiě)成尾遞歸的形式.

代碼:

?
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.

希望本文所述對(duì)大家的Python程序設(shè)計(jì)有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成年无限观看onlyfans | 亚洲色图第四色 | 日本色网址| 欧美亚洲国产另类在线观看 | 欧美成黑人性猛交xxoo | 青青草在视线频久久 | 婷婷丁香色综合狠狠色 | 女教师三级做受 | 韩国三级年轻的小婊孑 | 麻豆自拍| 久久视频这里只精品99热在线观看 | 欧美大片一区二区 | 日本69视频在线观看 | 亚洲高清中文字幕 | 波多野结衣xxxxx在线播放 | 日本人泡妞xxxxxx69 | 免费网站看v片在线成人国产系列 | 午夜亚洲WWW湿好爽 午夜想想爱午夜剧场 | 亚洲国产区男人本色在线观看欧美 | 国产成人精品一区二三区在线观看 | 欧美撒尿屁股嘘嘘撒尿 | 精品在线网站 | 啪啪导航 | 久久视频在线视频观看精品15 | 草莓丝瓜芭乐樱桃榴莲色多黄 | 亚洲va久久久久 | 99久久免费国产特黄 | 青青热久久综合网伊人 | 夫妻性生活影院 | 亚洲色图2| 精品国产区| 午夜伦午夜伦锂电影 | 国产日韩精品一区二区在线观看 | 亚欧有色在线观看免费版高清 | 99久久免费国内精品 | 国产v日韩v欧美v精品专区 | 无遮无挡免费视频 | 无人影院免费观看 | 日韩高清无砖砖区2022 | 好姑娘完整版在线观看中文 | 亚洲国产欧美在线看片 |