導航:首頁 > 編程語言 > python遞歸函數教學筆錄

python遞歸函數教學筆錄

發布時間:2023-10-09 22:32:48

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))

Ⅱ Python3:怎麼通過遞歸函數

函數的遞歸調用
遞歸問題是一個說簡單也簡單,說難也有點難理解的問題.我想非常有必要對其做一個總結.
首先理解一下遞歸的定義,遞歸就是直接或間接的調用自身.而至於什麼時候要用到遞歸,遞歸和非遞歸又有那些區別?又是一個不太容易掌握的問題,更難的是對於遞歸調用的理解.下面我們就從程序+圖形的角度對遞歸做一個全面的闡述.
我們從常見到的遞歸問題開始:
1 階層函數
#include <iostream>
using namespace std;
int factorial(int n)
{
if (n == 0)
{
return 1;
}
else
{
int result = factorial(n-1);
return n * result;
}
}
int main()
{
int x = factorial(3);
cout << x << endl;
return 0;
}
這是一個遞歸求階層函數的實現。很多朋友只是知道該這么實現的,也清楚它是通過不斷的遞歸調用求出的結果.但他們有些不清楚中間發生了些什麼.下面我們用圖對此做一個清楚的流程:
根據上面這個圖,大家可以很清楚的看出來這個函數的執行流程。我們的階層函數factorial被調用了4次.並且我們可以看出在調用後面的調用中,前面的調用並不退出。他們同時存在內存中。可見這是一件很浪費資源的事情。我們該次的參數是3.如果我們傳遞10000呢。那結果就可想而知了.肯定是溢出了.就用int型來接收結果別說10000,100就會產生溢出.即使不溢出我想那肯定也是見很浪費資源的事情.我們可以做一個粗略的估計:每次函數調用就單變數所需的內存為:兩個int型變數.n和result.在32位機器上佔8B.那麼10000就需要10001次函數調用.共需10001*8/1024 = 78KB.這只是變數所需的內存空間.其它的函數調用時函數入口地址等仍也需要佔用內存空間。可見遞歸調用產生了一個不小的開銷.
2 斐波那契數列
int Fib(int n)
{
if (n <= 1)
{
return n;
}
else
{
return Fib(n-1) + Fib(n-2);
}
}
這個函數遞歸與上面的那個有些不同.每次調用函數都會引起另外兩次的調用.最後將結果逐級返回.
我們可以看出這個遞歸函數同樣在調用後買的函數時,前面的不退出而是在等待後面的結果,最後求出總結果。這就是遞歸.
3
#include <iostream>
using namespace std;
void recursiveFunction1(int num)
{
if (num < 5)
{
cout << num << endl;
recursiveFunction1(num+1);
}
}
void recursiveFunction2(int num)
{
if (num < 5)
{
recursiveFunction2(num+1);
cout << num << endl;
}
}
int main()
{
recursiveFunction1(0);
recursiveFunction2(0);
return 0;
}
運行結果:
0
1
2
3
4
4
3
2
1
0
該程序中有兩個遞歸函數。傳遞同樣的參數,但他們的輸出結果剛好相反。理解這兩個函數的調用過程可以很好的幫助我們理解遞歸:
我想能夠把上面三個函數的遞歸調用過程理解了,你已經把遞歸調用理解的差不多了.並且從上面的遞歸調用中我們可以總結出遞歸的一個規律:他是逐級的調用,而在函數結束的時候是從最後面往前反序的結束.這種方式是很佔用資源,也很費時的。但是有的時候使用遞歸寫出來的程序很容易理解,很易讀.
為什麼使用遞歸:
1 有時候使用遞歸寫出來的程序很容易理解,很易讀.
2 有些問題只有遞歸能夠解決.非遞歸的方法無法實現.如:漢諾塔.
遞歸的條件:
並不是說所有的問題都可以使用遞歸解決,他必須的滿足一定的條件。即有一個出口點.也就是說當滿足一定條件時,程序可以結束,從而完成遞歸調用,否則就陷入了無限的遞歸調用之中了.並且這個條件還要是可達到的.
遞歸有哪些優點:
易讀,容易理解,代碼一般比較短.
遞歸有哪些缺點:
佔用內存資源多,費時,效率低下.
因此在我們寫程序的時候不要輕易的使用遞歸,雖然他有他的優點,但是我們要在易讀性和空間,效率上多做權衡.一般情況下我們還是使用非遞歸的方法解決問題.若一個演算法非遞歸解法非常難於理解。我們使用遞歸也未嘗不可.如:二叉樹的遍歷演算法.非遞歸的演算法很難與理解.而相比遞歸演算法就容易理解很多.
對於遞歸調用的問題,我們在前一段時間寫圖形學程序時,其中有一個四連同填充演算法就是使用遞歸的方法。結果當要填充的圖形稍微大一些時,程序就自動關閉了.這不是一個人的問題,所有人寫出來的都是這個問題.當時我們給與的解釋就是堆棧溢出。就多次遞歸調用佔用太多的內存資源致使堆棧溢出,程序沒有內存資源執行下去,從而被操作系統強制關閉了.這是一個真真切切的例子。所以我們在使用遞歸的時候需要權衡再三.

Ⅲ 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

Ⅳ 如何理解python中的遞歸函數

遞歸式方法可以被用於解決很多的計算機科學問題,因此它是計算機科學中十分重要的一個概念。

絕大多數編程語言支持函數的自調用,在這些語言中函數可以通過調用自身來進行遞歸。計算理論可以證明遞歸的作用可以完全取代循環,因此在很多函數編程語言(如Scheme)中習慣用遞歸來實現循環。
計算機科學家尼克勞斯·維爾特如此描述遞歸:
遞歸的強大之處在於它允許用戶用有限的語句描述無限的對象。因此,在計算機科學中,遞歸可以被用來描述無限步的運算,盡管描述運算的程序是有限的。

python 2 遞歸函數和其它語言,基本沒有差別,只是不支持尾遞歸。無限遞歸最大值為固定的,但可以修改。

作者:黃哥

Ⅳ 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

閱讀全文

與python遞歸函數教學筆錄相關的資料

熱點內容
移動硬碟顯示可用加密 瀏覽:944
python萬能庫開發 瀏覽:873
向日葵遠程解壓 瀏覽:881
androidedittext布局 瀏覽:320
題庫管理app哪個好用 瀏覽:989
安卓游戲中亮度自動調節如何關閉 瀏覽:892
求派演算法 瀏覽:551
pythonweb編程實例 瀏覽:190
鞋盒怎麼做文件夾收納盒視頻 瀏覽:757
模擬電子技術第四版pdf 瀏覽:961
解壓車貸後gps怎麼找 瀏覽:352
源碼資料庫怎麼配備 瀏覽:138
知乎程序員小灰 瀏覽:574
新概念英語第一冊書pdf 瀏覽:8
安卓ans文件怎麼打開 瀏覽:895
選擇題改進分治演算法的方法有 瀏覽:110
下載雲伺服器有什麼好處 瀏覽:23
江蘇機架式伺服器雲主機 瀏覽:411
linux補全命令 瀏覽:514
我要打命令 瀏覽:970