दिलचस्प समस्या वास्तव में दोनों मामलों में लूप अंतहीन नहीं है
लेकिन उनके बीच मुख्य अंतर यह है कि यह कब समाप्त होगा और x
अधिकतम int
मूल्य को पार करने में कितना समय लगेगा जो इसके 2,147,483,647
बाद अतिप्रवाह की स्थिति में पहुंच जाएगा और लूप समाप्त हो जाएगा।
इस समस्या को समझने का सबसे अच्छा तरीका एक सरल उदाहरण का परीक्षण करना और उसके परिणामों को संरक्षित करना है।
उदाहरण :
for(int i = 10; i > 0; i++) {}
System.out.println("finished!");
आउटपुट:
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
इस अनंत लूप का परीक्षण करने के बाद इसे समाप्त होने में 1 सेकंड से भी कम समय लगेगा।
for(int i = 10; i > 0; i++) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
आउटपुट:
infinite: 314572809
infinite: 314572810
infinite: 314572811
.
.
.
infinite: 2147483644
infinite: 2147483645
infinite: 2147483646
infinite: 2147483647
finished!
BUILD SUCCESSFUL (total time: 486 minutes 25 seconds)
इस परीक्षण मामले पर आप कार्यक्रम को समाप्त करने और समाप्त करने में लगने वाले समय में भारी अंतर देखेंगे।
यदि आप धैर्य नहीं रखते हैं, तो आप सोचेंगे कि यह लूप अंतहीन है और समाप्त नहीं होगा, लेकिन वास्तव में इसे समाप्त होने में घंटों का समय लगेगा और i
मूल्य पर अतिप्रवाह स्थिति तक पहुंच जाएगा ।
अंत में हम लूप के लिए प्रिंट स्टेटमेंट डालने के बाद निष्कर्ष निकालते हैं कि प्रिंट स्टेटमेंट के बिना पहले मामले में लूप की तुलना में अधिक समय लगेगा।
कार्यक्रम को चलाने के लिए लिया गया समय आपके कंप्यूटर की विशिष्टताओं पर निर्भर करता है विशेष प्रसंस्करण शक्ति (प्रोसेसर क्षमता), ऑपरेटिंग सिस्टम और आपका आईडीई जो प्रोग्राम को संकलित कर रहा है।
मैं इस मामले का परीक्षण करता हूं:
Lenovo 2.7 GHz Intel Core i5
ओएस: विंडोज 8.1 64x
आईडीई: नेटबीन्स 8.2
कार्यक्रम को समाप्त करने में लगभग 8 घंटे (486 मिनट) लगते हैं।
इसके अलावा, आप देख सकते हैं कि लूप के लिए कदम वृद्धि i = i + 1
अधिकतम अंतर मान तक पहुंचने के लिए बहुत धीमी कारक है।
हम इस कारक को बदल सकते हैं और कम समय में लूप का परीक्षण करने के लिए कदम बढ़ा सकते हैं।
अगर हम इसे डालते हैं i = i * 10
और इसका परीक्षण करते हैं:
for(int i = 10; i > 0; i*=10) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
आउटपुट:
infinite: 100000
infinite: 1000000
infinite: 10000000
infinite: 100000000
infinite: 1000000000
infinite: 1410065408
infinite: 1215752192
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
जैसा कि आप देखते हैं कि यह पिछले लूप की तुलना में बहुत तेज़ है
कार्यक्रम को समाप्त करने और समाप्त करने में 1 सेकंड से भी कम समय लगता है।
इस परीक्षण के उदाहरण के बाद मुझे लगता है कि इसे समस्या को स्पष्ट करना चाहिए और Zbynek Vyskovsky की वैधता साबित होती है - kvr000 का जवाब , यह भी इस सवाल का जवाब होगा ।
x
बढ़ती है । दूसरे शब्दों में, ऊपरी सीमा से कभी नहीं टकराएगा, इसलिए लूप "हमेशा के लिए" चलेगा। ठीक है, हमेशा के लिए नहीं, आपको सबसे अधिक संभावना किसी बिंदु पर एक अतिप्रवाह मिलेगा।j
j