सी ++ रिकर्सिव Febonacci समारोह

नीचे मेरा कोड है। मैंने फाइबोनैकी रिकर्सिव फ़ंक्शन को प्रिंट करने की कोशिश की [बहुत अंत में] लेकिन उसने मुझे सेगमेंट गलती दी। मेरे कोड में क्या गलत है? मैंने इस पर 3 घंटे बिताए और इसे समझ नहीं पाया। क्या कोई मुझे कुछ मदद देने के लिए कृपया दयालु हो सकता है? धन्यवाद

int fibonacci (int x) {


    if (x == 0) {
        return 0;
    }
    else if (x == 1) {
        return 1;
    }
    else {
    return (fibonacci(x-1) + fibonacci (x + 2));
    }
}
0
जोड़ा संपादित
विचारों: 1
ठीक है जहां fibonacci समारोह मुद्रित करने के लिए suppouse है।
जोड़ा लेखक NewFile, स्रोत
कहां (उर्फ, कौन सी रेखा) आप सीजी गलती प्राप्त कर रहे हैं?
जोड़ा लेखक Krease, स्रोत

2 उत्तर

शायद आपको segfault मिल रहा है क्योंकि आपका ढेर नियंत्रण के बिना बढ़ता है, और यह इस पंक्ति के कारण है:

    return (fibonacci(x-1) + fibonacci (x + 2));

मूल कारणों से अधिक मूल्य के साथ fibonacci() को कॉल करना गैर-पुनरावर्ती मामला कभी नहीं पहुंचाया जा सकता है, जिससे अंततः ढेर का प्रवाह हो जाता है, या ऐसा करने की कोशिश कर रहा है, क्योंकि एसओ इसका पता लगाएगा और आपकी प्रक्रिया को समाप्त कर देगा।

तो, उस पंक्ति को इस प्रकार फिर से लिखें:

    return (fibonacci(x-1) + fibonacci (x - 2));
0
जोड़ा
आप लोगों को धन्यवाद
जोड़ा लेखक NewFile, स्रोत
मैंने अभी यह देखा और फिर आपने उत्तर पोस्ट किया :)
जोड़ा लेखक Krease, स्रोत

वर्तमान में रिकर्सन कभी समाप्त नहीं होता क्योंकि:

return (fibonacci(x-1) + fibonacci (x + 2));

होना चाहिए

return (fibonacci(x-1) + fibonacci (x - 2));

वर्तमान कोड मेमोरी से चलने वाले स्टैक की ओर जाता है क्योंकि आप असीमित रूप से फ़ंक्शन कॉल जोड़ते रहते हैं और उस बिंदु पर जहां स्टैक स्मृति से बाहर है, आपको क्रैश मिलता है। जब आप नमूना संख्या के साथ निष्पादन के प्रवाह का पालन करते हैं तो आप देख सकते हैं कि क्या हो रहा है:

fibonnaci(2) = fibonacci(1)+fibonacci(4)
             = 1 + (fibonacci(3)+fibonacci(6))
             = 1 + (((fibonacci(2)+fibonacci(5))+(fibonacci(5)+fibonacci(8)))
             = 1 + .......

जैसा कि आप देख सकते हैं कि यह वास्तव में कभी समाप्त नहीं होता है।

0
जोड़ा
कॉपी पेस्ट त्रुटि? आपके सुधार में अभी भी x + 2 है (संपादित करें - वहां आप जाते हैं)
जोड़ा लेखक Krease, स्रोत
हां, कॉपी पेस्ट त्रुटि :) अब तय किया जाना चाहिए
जोड़ा लेखक shuttle87, स्रोत