/ / इन दो कार्यों के बीच अंतर क्या है और क्यों एक अनंत पुनरावृत्ति का कारण बनता है? - अजगर

इन दो कार्यों के बीच क्या अंतर है और क्यों एक अनंत पुनरावृत्ति का कारण बनता है? - अजगर

def flatten(S):
result = []
for item in S:
if is_listlike(item) and not is_listlike(item[0]):
result.append(item)
else:
result.extend(flatten(item))
return result

def flat(S):
if S == []:
return S
if isinstance(S[0], list):
return flat(S[0]) + flat(S[1:])
return S[:1] + flat(S[1:])

जब मैं फोन करता हूँ flat(listoflists) यह फेंकने लगता है

RuntimeError: maximum recursion depth exceeded while calling a Python object

लेकिन जब मैं फोन करता हूं flatten(listoflists) यह बढ़िया काम करता है।

मैं सोच रहा हूं कि ऊपर के दो कार्यों में क्या अंतर है, वे सूचियों की एक नेस्टेड सूची को समतल करने वाले हैं, लेकिन flat() कभी-कभी एक त्रुटि संदेश फेंकता है flatten() कभी शिकायत नहीं करता।

उत्तर:

जवाब के लिए 2 № 1

समस्या यह है कि flat() पुनरावर्ती है। यह अनंत पुनरावृत्ति का कारण नहीं बनता है, लेकिन यह एक सूची के साथ अधिकतम पुनरावृत्ति की गहराई को पार कर सकता है जो काफी बड़ा है। पायथन पूंछ पुनरावृत्ति अनुकूलन को लागू नहीं करता है, इसलिए भले ही सूची में कोई नेस्टेड सूची न हो, अधिकतम गहराई तक आसानी से पहुंचा जा सकता है।

दूसरी ओर flatten() ज्यादातर पुनरावृति है। यह केवल तभी पुनरावर्ती होता है जब यह नेस्टेड सूचियों का सामना करता है ताकि यह सही इनपुट के साथ अधिकतम गहराई तक भी पहुंच सके। यदि आप बड़ी सूचियों का उपयोग करने का इरादा रखते हैं तो यह अधिक उपयुक्त समाधान है।


जवाब के लिए 0 № 2

दूसरा फ़ंक्शन एक पुनरावर्ती कार्य है, अजगर में एक अधिकतम पुनरावृत्ति गहराई सीमा है। आप सीमा बढ़ाने के लिए निम्न कोड का उपयोग कर सकते हैं।

import sys
sys.setrecursionlimit(2000)