Python_物件導向_遞迴

來源:互聯網
上載者:User

標籤:迭代器   shu   nbsp   無限   tor   最簡   結束   可迭代對象   地區   

--遞迴本質
  函數調用是通過棧(stack)這種資料結構實現的
  每當進入一個函數調用,棧區就會加一層棧幀,
  每當函數返回,棧區就會減一層棧幀,但棧區空間有限,要注意防止棧溢出

# 遞迴函式:在函數內部,自己調用其自身即是遞迴函式
# 遞迴最簡易的原型

"""
  遞迴非常佔用記憶體空間,使用遞迴如果層級過大 不建議使用,記憶體容易溢出
  遞迴每一層調用的函數空間必須都執行完畢才算結束
  不能無限遞迴,需要給遞迴限制跳出的條件
"""

 

def digui(n):
  print(n)
  if n>0:
    digui(n-1)
    print(n)
digui(5)

 

def jiecheng(n):
  if n == 1:
    return 1
  return n * jiecheng(n-1)

res2 = jiecheng(5)
print(res2)

--尾遞迴
  尾遞迴:在函數返回的時候,調用其本身,並且,return語句不包含運算式。(簡單來說是遞迴函式,且只調用自己非運算式)
  尾遞迴意義:使遞迴本身無論調用多少次,都只佔用一個棧幀,不會出現棧溢出的情況.(需要Python解譯器支援)

 

def fact(n):
  return fact_iter(n, 1)

def fact_iter(num, product):
  if num == 1:
    return product
  return fact_iter(num - 1, num * product)

res = fact(5)
print(res)

 

  ***瞭解內容--start--***
    棧:後進先出的一種資料結構
    堆:排序後的一種樹狀資料結構

  --記憶體中的棧區 : 自動分配 自動釋放
    棧區:按照後進先出的資料結構(棧),無論建立或銷毀都是自動為資料分配記憶體,釋放記憶體(系統自動做的)
  --記憶體中的堆區 : 手動分配 手動釋放
    堆區:按照排序後的樹狀資料結構(堆),可優先取出必要資料,無論建立或銷毀都是手動分配記憶體,釋放記憶體(程式員手動做的)


  運行程式時在記憶體中執行,會因為資料類型的不同而在記憶體的不同地區運行
  因不同語言對記憶體劃分的機制不一,但大體來講,有如下四大地區
    棧區: 分配局部變數空間.
    堆區: 是用於手動分配程式員申請的記憶體空間.
    靜態區(全域棧區): 分配靜態變數,全域變數空間.
    代碼區(唯讀區,常量區): 分配常量和程式碼空間的.

    棧區 堆區 靜態區 代碼區 都是記憶體中的一段空間
  ***瞭解內容--end--***



--匿名函數:lambda運算式

"""
  lambda文法:lambda 參數 : 傳回值
  不帶參數的寫法 #案例 lambda : 10
  帶參數的寫法 案例:lambda a,b: a+b
  條件分支的寫法 lambda n : "偶數" if n % 2==0 else "奇數"
"""
# 案例1 不帶參數
def niminghanshu():
  return 10

res = lambda : 10
print(res())

# 案例2 帶上參數
def niminghanshu2(a,b):
  return a+b

func = lambda a,b : a+b
res = func(5,6)
print(res)

# 案例3 條件分支寫法
def niminghanshu3(n):
  if n % 2 == 0:
    return "偶數"
  else:
    return "奇數"

func = lambda n : "偶數" if n % 2==0 else "奇數"
res = func(11)
print(res)


# 迭代器:可以被next()函數調用並不斷返回下一個值的對象稱為迭代器(Iterator 迭代器是對象)
# 迭代器是一種惰性序列,它通過計算把值依次的返回,而不是一次性的得到所有資料放到記憶體中

# 迭代器
for i in range(1,10):
  print(i)

from collections import Iterable,Iterator
res1 = isinstance(range(1,10), Iterable) #判斷是否是
# 可迭代的 可迭代的對象
res2 = isinstance(range(1,10),Iterator)
print(res1)
print(res2)

# 用iter 函數 把具有可迭代性的資料 轉換成 迭代器
res3 = iter(range(1,10))
print(res3)
res4 = isinstance(res3,Iterator)
print(res4)
"""
res5 = range(1,10)
next(res5)
"""
print("<==>")
res6 = iter(range(1,5))

print("<==123==>")

print(res6)
res7 = next(res6)
res8 = next(res6)
res9 = next(res6)
res10 = next(res6)

"""

# Iterable可迭代的 Iterator迭代器
from collections import Iterable,Iterator
res1 = isinstance(range(1,10), Iterable) #判斷是否是可迭代的
res2 = isinstance(iter(range(1,10)), Iterator) #判斷是否是迭代器
res3 = list(range(1,10)) #list可以強轉具有迭代性的資料或者迭代器
print(res1)
print(res2)
print(res3)

"""
# 首先獲得Iterator對象: 通過iter把可迭代對象 轉換成 迭代器
it = iter([1, 2, 3, 4, 5])

    ***瞭解內容--start--***
    # 迴圈:
    while True:
      try:
        # 獲得下一個值:
        x = next(it)
      except StopIteration:
        # 遇到StopIteration就退出迴圈
        break
    ***瞭解內容--end--***

惰性序列:沒有一次性的把所有資料都放在序列中,而是遍曆一個放一個,這樣的序列
range 是 可迭代對象
range 和 迭代器 能夠產生惰性序列

 

Python_物件導向_遞迴

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.