簡體   English   中英

在不使用 len 的情況下使用遞歸 function 計算列表的元素數

[英]counting the number of elements of a list using recursive function without using len

我看到了這段代碼:

def list_length(my_lis):
    if mylist:
        return 1 + list_length(my_lis[1:])
    return 0

此代碼在不使用 len function 的情況下遞歸計算列表中的元素數。 有人可以解釋一下 list_length(my_lis[1:]) 以及它是如何添加到 1 的,因為據我了解,my_lis[1:] 給出的列表沒有第一個元素。 那么這怎么能給出列表中元素的數量呢?

啊遞歸,往往會使事情變得比他們需要的更復雜,但它仍然很酷!

讓我們添加一些調試代碼來看看發生了什么

def list_length(my_lis):
    if my_lis:
        print(my_lis)
        length = list_length(my_lis[1:])
        print(str(my_lis) + " returning 1 + " + str(length))
        return 1 + length 
    print("Empty List! Return 0")
    return 0

test_list = ['1', '2', '3', '4']

answer = list_length(test_list)

print("Answer: " + str(answer))

這將 output:

['1', '2', '3', '4']
['2', '3', '4']
['3', '4']
['4']
Empty List! Return 0
['4'] returning 1 + 0
['3', '4'] returning 1 + 1
['2', '3', '4'] returning 1 + 2
['1', '2', '3', '4'] returning 1 + 3
Answer: 4

請注意,我們如何僅在列表為空后才到達基本情況(返回 0)。 還要注意,在我們達到基本情況之后,這個數字才會開始上升。 只有在我們到達一個空列表之后,我們才能開始返回鏈並計算 1 + 最后一個 function 得到的值。

考慮

my_lis = [1,2,3]

如果條件滿足,因為列表不為空,因此返回 1+list_length(my_lis[1:]) 表示 my_lis[1:] 表示 [2,3]。 因此,概括地說,您將列表的長度減少一個,即您計算第一個元素並忽略第一個元素。

return 1+ list_length(my_lis[1:])            #my_lis=[2,3]
return 1+ 1+ list_length(my_lis[1:])         #my_lis=[3]
return 1+ 1+ 1+ list_length(my_lis[1:])      #my_lis=[]
return 1+ 1+ 1+ 0

這如下:

  • 如果my_lis不是假的(假設非空列表)
  • 返回 1 + 在下一項的列表上調用相同的函數,直到最后一項
  • 如果這個新列表不是假的
  • 返回 1 + 在下一項的列表上調用相同的函數,直到最后一項
  • ...

這一直持續到my_lis[1:]返回 None,在這種情況下,我們將返回 0 而不是返回 1,並且不會觸發另一個遞歸調用。

從最里面開始:

  • my_lis為空, return 0
  • my_lis不為空, return 1 + 0
  • my_lis不為空, return 1 + (1 + 0)
  • my_lis不為空, return 1 + (1 + 1 + 0)
  • ...

這就是您最終獲得列表長度的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM