天天看點

遞歸的了解以及與循環,疊代的差別(Python 示例)1,什麼是遞歸2,遞歸函數執行個體

目錄

1,什麼是遞歸

1.1,遞歸與循環的差別

2,遞歸函數執行個體

2.1,Fibonacci sequence(斐波那契數列)

2.2,Collatz sequence      

1,什麼是遞歸

        遞歸最初給我的感覺就是循環嵌套調用(并不準确),對于遞歸這種思想,可以從遞歸函數來了解。先來看看遞歸函數的定義:

        程式設計語言中,函數Func(Type a,……)直接或間接調用函數本身,則該函數稱為遞歸函數。

        在數學上,關于遞歸函數的定義如下:對于某一函數f(x),其定義域是集合A,那麼若對于A集合中的某一個值X0,其函數值f(x0)由f(f(x0))決定,那麼就稱f(x)為遞歸函數。

1.1,遞歸與循環,疊代的差別

        注意上文紅字【調用函數本身】,遞歸思想也有循環,但與循環有所差別,兩種的差別我個人了解如下:

【遞歸】:需要求一個遞歸函數的值,就要調用這個遞歸函數,調用遞歸函數後又要調用遞歸函數......直到最後的遞歸函數得到一個确定的值。這時候就需要逆序,可以得到倒數第二個遞歸函數的值,然後得到倒數第三個遞歸函數的值......最後就能得到你最初始想要求的遞歸函數的值。

【循環】:循環得到一個值時(比如1+2+...+10),這樣需要慢慢兩個數相加,但加到最後時就可以直接得到結果了(死循環例外),就結束了循環。

【疊代】:重複回報過程的活動,其目的通常是為了接近或達到所學的目标或結果

2,遞歸函數執行個體

        下面通過兩個遞歸執行個體來更好的了解遞歸的思想。

2.1,Fibonacci sequence(斐波那契數列)

        斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……

        在數學上,斐波那契數列以如下被以遞推的方法定義:F(1)=1,F(2)=1, F(n)=F(n-1) + F(n-2)(n>=3,n∈N*)

【遞歸實作】

def fib(x):
    if x <2:
        return 0 if x==0 else 1
    else:
        return fib(x - 1) + fib(x - 2)

print(fib(6))
           

上面的函數表明了一個數列:a0=0, a1=1, a2=1, a3= 2, a4=3, a5=5, a6=8......

執行後得到的結果如下:

遞歸的了解以及與循環,疊代的差別(Python 示例)1,什麼是遞歸2,遞歸函數執行個體

【疊代實作】

def fib(x):
    n1 = 1
    n2 = 1
    n3 = 1

    while x-2 > 0:
        n3 = n2 + n1
        n1 = n2
        n2 = n3
        x -= 1
    return n3

num = int(input('請輸入一個正整數:'))
print(fib(num))
           

 結果如下:

遞歸的了解以及與循環,疊代的差別(Python 示例)1,什麼是遞歸2,遞歸函數執行個體

疊代像在通過數列的遞推公式一步步計算,在資料很小的情況沒什麼影響,若是第50位,疊代很快給出結果,遞歸方式計算時間更長。通常來說,大量資料情況下,遞推方式更費時,占用記憶體。要合理使用疊代與遞歸。

2.2,Collatz sequence      

        編寫一個名為collatz()的函數,它有一個名為number 的參數。如果參數是偶數,那麼collatz()就列印出number// 2,并傳回該值。如果number 是奇數,collatz()就列印并傳回3 * number + 1。然後編寫一個程式,讓使用者輸入一個正整數,并不斷對這個數調用collatz(),直到函數傳回值1

def collatz(num):
    if num == 1:
        return 0
    elif num%2 == 0:
        print(num//2)
        return collatz(num//2)
    elif num%2 == 1:
        print(3*num+1)
        return collatz(3*num+1)

print('Enter number')
a=int(input())
print('The Collatz ')
collatz(a)
           

執行結果如下:

遞歸的了解以及與循環,疊代的差別(Python 示例)1,什麼是遞歸2,遞歸函數執行個體