撰寫一個函式 recursiveLongestString(lst),它將字串串列作為輸入并回傳串列中最長的字串。您可以假設該串列至少包含一個元素并且不會有平局。該函式必須以有意義的方式使用遞回;使用回圈或內置 max 函式的解決方案將不得分。例如,recursiveLongestString(["a", "bb", "ccc"])回傳"ccc",并
recursiveLongestString(["hi", "its", "fantastic", "here"])回傳
"fantastic"。
到目前為止,這是我的代碼:
def recursiveLongestString(lst):
if(len(lst)==1):
return(lst[0])
else:
smaller= recursiveLongestString(lst[1:])
if len(lst[0])<len(lst[1]):
return smaller
else:
return lst[0] smaller
我知道為什么它錯了,但似乎無法找到解決方案。請幫忙
uj5u.com熱心網友回復:
你很親近。在 if/else 中,您應該只回傳一個字串,因為那是您recursive_longest最終想要回傳的內容。嘗試這個:
def recursive_longest(lst):
if len(lst) == 1:
return lst[0]
current = lst[0]
longest = recursive_longest(lst[1:])
if len(current) < len(longest):
return longest
else:
return current
給你的好處:你可能還想在開頭添加一個額外的 if 陳述句來決定如果提供的串列是空的你可以做什么。
uj5u.com熱心網友回復:
為了有意義的使用,您可以將串列分成兩部分并遞回串列的左右子集以確定兩個最長的字串,然后將這兩個字串進行比較以獲得最終結果:
def recursiveLongestString(lst,start=0,end=None):
if end is None: end = len(lst)-1 # initial range is whole list
if start==end: return lst[start] # base condition, stops recursion
mid = (start end)//2 # split index
maxLeft = recursiveLongestString(lst,start,mid) # longest on the left
maxRight = recursiveLongestString(lst,mid 1,end) # longest on the rigth
return maxLeft if len(maxLeft)>len(maxRight) else maxRight
recursiveLongestString(["hi", "its", "fantastic", "here"])
'fantastic'
當您的串列接近 1000 個專案時,這具有不會達到遞回深度限制的優點。此外,它不會創建串列內容的任何副本
通過使用默認引數在遞回呼叫中傳輸最長的字串,可以使簡化方法更加緊湊:
def recursiveLongestString(L,S=""):
return recursiveLongestString(L[1:],(L[0],S)[len(S)>len(L[0])]) if L else S
uj5u.com熱心網友回復:
這是一個更有效的版本,因為您lst[1:]需要線性時間和空間,因此您的整個程序需要二次時間和空間。這個只需要線性的時間和空間:
def recursiveLongestString(lst):
if not lst:
return ''
s = lst.pop()
t = recursiveLongestString(lst)
lst.append(s)
return s if len(s) > len(t) else t
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/328825.html
上一篇:輸出時的隨機值
下一篇:需要幫助理解基本的遞回問題
