隨着您的問題解決,我w應該一般性地解釋循環與尾遞歸的概念,因爲尾遞歸通常是一種有用的技術。
儘管Python中的循環和列表理解意味着您不太可能需要尾遞歸,但有一個想法是很好的。
遞歸調用函數的技術稱爲尾遞歸。使用尾遞歸和循環可以達到同樣的效果,但是你不需要兩者。
,做你想做,你可以使用一個循環什麼:
def ifeveryitems(lst):
for items in lst:
if not isinstance(items,list) or len(items) > 2:
return False
return True
或尾遞歸:
def ifeveryitems(lst):
if isinstance(items,list) and len(lst)==0:
return True
return isinstance(lst[0],list) and len(lst[0]) <= 2 and ifeveryitems(lst[1:])
此功能檢查的lst
的第一個項目是列表,是一個長度爲2或更少,然後使用函數本身檢查列表的其餘部分(lst[1:]
)。最終,它會通過快捷方式返回False(當isinstance(lst[0],list) and len(lst[0]) <= 2
爲False時)或到達整個列表耗盡的基本情況,此時它將返回True。
再舉一個例子:自己實現len(L)
。
假設L
將永遠是一個列表,你可以使用一個循環實現len
:
def len(L):
i = 0
for item in L:
i += 1
return i
(注:使用這樣的循環也被稱爲累積)
或尾遞歸。
def len(L):
if L==[]:
return 0
return 1 + len(l[1:])
它刪除列表中的第一個項目,並將其餘列表的長度加1。最終,它會達到L耗盡的地步,並被減少到空列表,在這種情況下,它將返回0.
非常感謝!這正是我正在尋找的! –
'如果isinstance(items,list))'all(len(items)<= 2)'可能更具可讀性 – jfs
@ J.F.Sebastian:好點! – Ryan