日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python递归函数代码_Python递归函数

發布時間:2025/3/20 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python递归函数代码_Python递归函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考:

一、遞歸函數兩大要素 --終止條件和遞歸方程

1、遞歸方程,即遞歸調用的方法

遞歸通俗的說就是在函數內部自己調用自己,如何調用就是遞歸方程。

以以下的sum(n)求和函數遞歸實現方式為例,遞歸調用方式就是返回n+sum(n-1),這樣sum(n)的計算方式就類似如下:

sum(n)=n+sum(n-1) #遞歸方程,以下為其展開

sum(n)=n+(n-1)+sum(n-2)

...

sum(n)=n+(n-1)+(n-2)+...+sum(1)

到這里遞歸循環就應該結束了,很自然的我們得到了遞歸循環的結束條件:n=0,此時的返回就不是0+sum(-1)了,直接返回0結束循環即可。

2、終止條件,即從哪里開始和結束

從哪里開始和結束要分情況,在上例中有明確的結束條件n=0,n>0則進入遞歸循環,其隱形的條件就是n不能小于0,因此其開始條件寫個n>0即可。

而其他場景例如遍歷B樹這種,開始一定是根節點,結束時一定是葉子結點,那么只要開始處理下根節點的打印,之后遞歸循環子節點即可,因此初始返回值就是根節點相關,之后遞歸調用以便遍歷子節點和后代節點們,終止條件就是找不到子節點。

二、遞歸函數示例:

#!/usr/bin/env python

def sum(list):

sum = 0

# Add every number in the list.

for i in range(0, len(list)):

sum = sum + list[i]

# Return the sum.

return sum

print(sum([5,7,3,8,10]))

#!/usr/bin/env python

def sum(list):

if len(list) == 1:

return list[0]

else:

return list[0] + sum(list[1:])

print(sum([5,7,3,8,10]))

以上兩個函數,第一個使用普通循環方式求和,第二個使用遞歸循環的方式求和,從效率來講第一個更好,從邏輯上來講遞歸函數更加清晰簡潔。

三、遞歸的限制條件:

遞歸函數使用棧來存儲函數調用,過多的遞歸會導致棧溢出,例如sum([一個超長的序列]),因此平時推薦使用簡單循環即可,但是遇到需要進行多層循環或者根本不清楚循環層數的場景,遞歸就很有用了,只要確定了終止條件和遞歸方程就可以實現遍歷。

在Python中遞歸超過1000此就會報出:“RuntimeError: maximum recursion depth exceeded”報錯,因此遞歸也不是無限循環的,這個值也可以修改,你需要大致估算下你的遞歸次數,然后通過以下方式修改:

#!/usr/bin/env python

import sys

sys.setrecursionlimit(5000)

#階乘實現示例:

def factorial(n):

if n == 1:

return 1

else:

return n * factorial(n-1)

print factorial(3000)

四、遞歸函數的使用場景:

一些場景下循環層次數未知,使用遞歸會非常簡便,例如遍歷xml文件節點的代碼:

#coding=utf-8

from xml.dom.minidom import parse

import sys

reload(sys)

sys.setdefaultencoding("utf-8")

root=parse('').documentElement

#開始遍歷節點

def iter_xmlNodes(node):

if node == None:

return

if node.nodeType == node.ELEMENT_NODE: #只有ELEMENT_NODE類型的node才有遍歷的必要

print ("ELEMENT Node:%s" %(node))

for child in node.childNodes:

iter_xmlNodes(child)

else:

print ("Node:%s, NodeType:%d" %(node,node.nodeType))

#對于前兩個if,第一個if表示終止條件,第二個if表示對輸入節點的處理,對其子節點執行遞歸。

iter_xmlNodes(root)

總結

以上是生活随笔為你收集整理的python递归函数代码_Python递归函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。