1. python遞歸函數
def Sum(m): #函數返回兩個值:遞歸次數,所求的值 if m==1:return 1,m return 1+Sum(m-1)[0],m+Sum(m-1)[1]cishu=Sum(10)[0] print cishu >>> def Sum(m,n=1): ... if m==1:return n,m ... return n,m+Sum(m-1,n+1)[1] >>> print Sum(10)[0] 10 >>> print Sum(5)[0] 5
2. Python遞歸
用遞歸
3. 關於python遞歸函數怎樣理解
遞歸的思想主要是能夠重復某些動作,比如簡單的階乘,次方,回溯中的八皇後,數獨,還有漢諾塔,分形。
由於堆棧的機制,一般的遞歸可以保留某些變數在歷史狀態中,比如你提到的return
x
*
power...,
但是某些或許龐大的問題或者是深度過大的問題就需要盡量避免遞歸,因為可能會棧溢出。還有一個問題是~python不支持尾遞歸優化!!!!所以~還是盡量避免遞歸的出現。
def
power(x,
n)
if
n
<
0:
return
1
return
x
*
power(x,
n
-
1)
power(3,
3)
3
*
power(3,
2)
3
*
(3
*
power(3,
1))
3
*
(3
*
(3
*
power(3,
0)))
3
*
(3
*
(3
*
1))
這里n
=
0,
return
1
3
*
(3
*
3)
3
*
9
27
當函數形參n=0的時候,開始回退~直到第一次調用power結束。
4. python循環、遞歸
for 變數 in range(次數):<被執行的語句> 變數:表示每次循環的次數,0-1之間
range(n)n表示產生0到n-1的整數序列共N個 range(m,n) 產生m到n-1的整數序列,共n-m個
循環for語句 :for 循環變數 in遍歷結構:<語句體1> else:<語句體2>
無限循環: while條件: 語句塊
while 條件:語句體1 else: 語句體2
循環保留字:break continue
方法1:from random import random
from time import perf_counter
DARTS=1000
hits=0.0
start =perf_counter()
for i in range(1,DARTS+1):
x,y=random(),random()
dist=pow(x**2+y**2,0.5)
if dist<=1.0:
hits =hits+1
pi=4*(hits/DARTS)
print("圓周率是:{}".format(pi))
print("運行時間是{:.5f}s".format(perf_counter()-start))
方法2:
pi=0
n=100
for k in range(n):
pi += 1/pow(16,k)*(\
4/(8*k+1)-2/(8*k+4) - \
1/(8*k+5) - 1/(8*k+6))
print("圓周率值是:{}".format(pi))
def 函數名 (0個或者多個):函數體 renturn 返回值
def 函數名 (非可選參數,可選參數):函數體 renturn 返回值
參數傳遞的兩種方式:位置傳遞,名稱傳遞
科赫雪花:
import turtle
def koch(size,n):
if n==0:
turtle.fd(size)
else:
for angle in [0,60,-120,60]:
turtle.left(angle)
koch(size/3,n-1)
def main():
turtle.setup(400,200)
turtle.penup()
turtle.pendown()
turtle.pensize(2)
l=3
koch(600,l)
turtle.right(120)
turtle.pencolor('blue')
koch(600,l)
turtle.right(120)
turtle.pencolor('red')
koch(600,l)
turtle.speed(3000)
turtle.hideturtle()
main()
階乘:
def fact(n):
s=1
for i in range(1,n+1):
s*=i
return s
c=eval(input("從鍵盤輸入一個數字"))
print("階乘結果",fact(c))
5. python怎麼用遞歸輾轉相除法
圖中兩個函數等效,A 使用經典條件分支結構,B 使用條件表達式
運行結果
6. 小白有一個關於python遞歸的問題 求教
首先,os是標准庫的一個模塊,而非函數。
遞歸沒有什麼特殊的地方,只是調用一個函數。巧的是,這個函數就是自己而已。你可以想像「查找文件」這個函數有無數個備份,而每次遞歸遇到就隨便哪來用一個,和普通的函數調用沒有什麼區別。
所以,返回父目錄就是在查找文件函數執行完成後執行的。
把你的手掌伸直,五指分開,從手腕開始沿著肉的邊緣走一圈,最終又會回到手腕起點(忽略寬度),哪怕你的手指上又長出若干個小手指,沿著邊緣走一圈,總會回到手腕。這就是遞歸執行的過程,每個手指就是一個遞歸調用。你可以在紙上畫一個樹狀結構,設置三層目錄,按照函數的調用過程來理解。
或者可以這么理解,假如國家要進行人口普查,就可以讓每個省把自己的人口普查的結果回報上來,然後加起來就可以了。那麼國家在加的時候,必須要等所有省都普查完後才能進行加(相當於你的返回上級目錄的操作)。對於每個省來說,類似的,只要讓每個市進行人口普查,然後把結果相加即可。每個省也都要等到它的所有市都普查完畢後才能相加。同理,每個市對於每個縣也是同樣的操作。這就是遞歸的過程。——但需要注意的是,所有縣的普查可以同時進行,但計算機遞歸卻是一個完成後才能進行下一個。和畫手指是一樣的,必須一個手指畫完後才能進行下一個。
7. python遞歸演算法經典實例有哪些
程序調用自身的編程技巧稱為遞歸( recursion)。遞歸做為一種演算法在程序設計語言中廣泛應用。 一個過程或函數在其定義或說明中有直接或間接調用自身的一種方法。
它通常把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算,大大地減少了程序的代碼量。
遞歸的能力在於用有限的語句來定義對象的無限集合。一般來說,遞歸需要有邊界條件、遞歸前進段和遞歸返回段。當邊界條件不滿足時,遞歸前進;當邊界條件滿足時,遞歸返回。
Python
是完全面向對象的語言。函數、模塊、數字、字元串都是對象。並且完全支持繼承、重載、派生、多繼承,有益於增強源代碼的復用性。Python支持重載運算符和動態類型。相對於Lisp這種傳統的函數式編程語言,Python對函數式設計只提供了有限的支持。有兩個標准庫(functools, itertools)提供了Haskell和Standard ML中久經考驗的函數式程序設計工具。
8. python里如何用遞歸法列出一個tree里所有的枝幹
您好:perm函數輸出的是參數list從參數k位置開始,到參數m位置結束的全排列
def perm(list,k,m):
if k==m:
for i in range(m+1): # 遞歸的結束條件是k==m,在整個遞歸過程中參數m(即結束位置沒有改變),而參數k則每次遞歸+1
print list[i], # 輸出遞歸結束時的list狀態
print
else:
for i in range(k,m+1): # 該循環用來負責生成遞歸的下一個狀態
list[k],list[i]=list[i],list[k] # 將list的k位置與每一個位置i分別交換
perm(list,k+1,m) # 由於k位置與每一個位置i交換,也即k位置所有可能選值都已被窮舉,此時只需要繼續計算k+1之後的職位即可,因此以k+1為開始位置,結束位置m不變進入下一層遞歸
list[k],list[i]=list[i],list[k] # 由於list是引用傳遞,因此需要在位置交換之後重新交換,以保證list不變。
9. Python 實現遞歸
一、使用遞歸的背景
先來看一個☝️介面結構:
這個孩子,他是一個列表,下面有6個元素
展開children下第一個元素[0]看看:
發現[0]除了包含一些欄位信息,還包含了 children 這個欄位(喜當爹),同時這個children下包含了2個元素:
展開他的第一個元素,不出所料,也含有children欄位(人均有娃)
可以理解為children是個對象,他包含了一些屬性,特別的是其中有一個屬性與父級children是一模一樣的,他包含父級children所有的屬性。
比如每個children都包含了一個name欄位,我們要拿到所有children里name欄位的值,這時候就要用到遞歸啦~
二、find_children.py
拆分理解:
1.首先import requests庫,用它請求並獲取介面返回的數據
2.若children以上還有很多層級,可以縮小數據范圍,定位到children的上一層級
3.來看看定義的函數
我們的函數調用:find_children(node_f, 'children')
其中,node_f:json欄位
children:遞歸對象
以下這段是實現遞歸的核心:
if items['children']:
items['children']不為None,表示該元素下的children欄位還有子類數據值,此時滿足if條件,可理解為 if 1。
items['children']為None,表示該元素下children值為None,沒有後續可遞歸值,此時不滿足if條件,可理解為 if 0,不會再執行if下的語句(不會再遞歸)。
至此,每一層級中children的name以及下一層級children的name就都取出來了
希望到這里能幫助大家理解遞歸的思路,以後根據這個模板直接套用就行
(晚安啦~)
源碼參考: https://www.coder4.com/archives/5767
10. python中如何使用遞歸實現這個功能
簡單說,解決以上問題的思路是,循環執行n*n-1,直到n=1時。
如何理解呢?第一點,函數中,調用自身函數的那部分句子,即return n *
recursion(n-1),把recursion(n-1)想像成另一個獨立的函數,該函數的功能返回n-1的值,如果n的值是1,則返回1,函數運行結束。第二點,直觀的看,可以把return
n * recursion(n-1)看成return n*(n-1)*(n-2)...1。而遞歸函數無非是在指定的條件下做普通的循環而已。