एक शाम आपके हाथ एक पुरानी नोटबुक लगी, जिसमें समझ न आने वाली घसीट भरी थी, मानो कोई जुनून की हद तक किसी विचार का पीछा कर रहा हो। एक पेज पर एक ही सवाल सबसे अलग चमक रहा था: क्या हर संख्या 1 तक पहुँचने का रास्ता खोज ही लेती है? यह किसी कोलाट्ज़ अनुमान नाम की चीज़ से जुड़ा था, ऐसी पहेली जिसने दशकों से विचारकों को उलझाए रखा है।
नियम ऊपर से बहुत आसान लगते थे। कोई भी धनात्मक पूर्णांक चुनिए।
फिर इन्हीं चरणों को नतीजे पर दोहराइए, और यह क्रम इसी तरह अनंत तक चलता रहता है।
उत्सुक होकर आपने परखने के लिए संख्या 12 चुनी और यात्रा शुरू की:
12 ➜ 6 ➜ 3 ➜ 10 ➜ 5 ➜ 16 ➜ 8 ➜ 4 ➜ 2 ➜ 1
दूसरी संख्या (6) से गिनें तो 1 तक पहुँचने में 9 चरण लगे, और जितनी बार ये नियम दोहराए गए, संख्या बदलती चली गई। शुरू में यह क्रम अनुमान से परे लगा। कभी ऊपर उछलता, कभी नीचे, कभी इधर-उधर। फिर भी यह अनुमान कहता है कि शुरुआती संख्या कोई भी हो, हम हमेशा 1 पर ही पहुँचेंगे।
यह बहुत दिलचस्प था, पर साथ ही हैरान करने वाला भी। यह हर बार काम क्यों करता दिखता है? क्या कोई ऐसी संख्या हो सकती है जहाँ यह प्रक्रिया टूट जाए, जो हमेशा के लिए लूप में फँस जाए या अनंत में निकल जाए? नोटबुक में लिखा था कि शायद इसे सुलझाने से कोई बहुत गहरी बात सामने आए, और जो भी इसके राज़ खोल सकेगा, उसके लिए प्रसिद्धि, धन और इतिहास में एक जगह इंतज़ार कर रहे हैं।
एक धनात्मक पूर्णांक दिया गया हो, तो Collatz Conjecture के नियमों के अनुसार 1 तक पहुँचने में लगने वाले चरणों की संख्या लौटाइए।
कभी-कभी एक्सेप्शन रेज करना ज़रूरी हो जाता है। ऐसा करते समय आपको हमेशा एक अर्थपूर्ण एरर संदेश देना चाहिए, जिससे पता चले कि एरर का स्रोत क्या है। इससे आपका कोड पढ़ने में आसान हो जाता है और डीबग करने में काफी मदद मिलती है। जहाँ आपको पता हो कि एरर का स्रोत किसी खास टाइप का ही है, वहाँ आप अंतर्निहित एरर टाइप में से कोई एक रेज कर सकते हैं, लेकिन तब भी एक अर्थपूर्ण संदेश देना चाहिए।
कोलाट्ज़ अनुमान में सिर्फ शून्य से बड़े पूर्णांकों की बात होती है। इसलिए इस अभ्यास में आपको raise स्टेटमेंट इस्तेमाल करना है। साथ ही, अगर दी गई वैल्यू शून्य या ऋणात्मक पूर्णांक हो, तो अपने हल में ValueError "फेंकना" है। टेस्ट तभी पास होंगे जब आप exception को raise भी करेंगे और उसके साथ एक संदेश भी देंगे।
किसी संदेश के साथ ValueError रेज करने के लिए संदेश को exception टाइप के आर्गुमेंट के रूप में लिखिए:
# example when argument is zero or a negative integer
raise ValueError("Only positive integers are allowed")
Exercism पर साइन अप कीजिए और Python को 17 कॉन्सेप्ट146 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।