Рекурсияны қолданатын санның факторы

Сандар фракторийін есептеу үшін төмендегі рекурсивті функция бар. Бағдарлама жағдайды жоюдан басқа, тамаша жұмыс істейді. Неліктен біреу түсіндіре алады ма?

Бұл жақсы жұмыс істейтін код -

public static long factUsingRecursion(int number) {
    if (number == 1) {
        return 1;
    } else {
        return number * factUsingRecursion(number - 1);
    }
}

Егер шарт болмаса (қатені шығаратын код),

public static long factUsingRecursion(int number) {
    return number * factUsingRecursion(number - 1);
}

Мен стек толып кету қатесін аламын.

Негізгі « java.lang.StackOverflowError    birst.FactorialUsingRecursion.factUsingRecursion (FactorialUsingRecursion.java:10) мекенжайында

Сарапшылардан сұраңыз, неге бұлай?

0
ұзындықтар оң сандармен шектелмейді. Компьютерлер сіз айтқандарыңыздың бәрін жасайды ... сондықтан функция функциясы бірден тоқтаған кезде сиқырлы түрде тоқтайды. Егер if операторы болмаса, функциядан кейін функцияны стекке ешбір мәлімдемесіне мүмкіндік жоқ регурсияны қайтарады және аяқтайды. нөмір стека толғанға дейін теріс шексіздікке қарай өтеді
қосылды автор sunrize920, көзі
Кеңес: Егер жоқ болса - тоқтаған кезде қалай шешесіз?
қосылды автор cpt. jazz, көзі
Сұрақтың біреуін «қабылданған жауапты» ғана таңдауға болады.
қосылды автор rgettman, көзі
Кез келген рекурсия әрдайым рекурсияны аяқтау үшін негізгі шартқа ие болуы керек. Егер шарт тек базалық жағдайда ғана болса. Енді ол шексіз рекурсияға айналады.
қосылды автор Rohit Jain, көзі

7 жауаптар

Рекурсия кезінде әрдайым рекурсияны тоқтататын негізгі жағдай болуы керек. if болмаса, сізде базалық оқиға болмайды және оны ештеңе тоқтатады. Ақыр аяғында стекке және StackOverflowError нәтижелеріне тым көп әдіс шақырулар кіреді.

7
қосылды
Неліктен бұл төмендетілді?
қосылды автор Rohit Jain, көзі

number айнымалы мәнін тудыратын бұл желі 1-ге азайтылады

return number * factUsingRecursion(number - 1);

және ол <1> болған жағдайды қоспағанда number барлық мәндерін өңдейді

сондықтан кодтың бұл жолы үзіліс шарты болып табылады

if (number == 1) {
        return 1;

}

және тастаудан құтылуды болдырмауға мүмкіндік бермейді

2
қосылды

Сіз қоңырау шалғанда не болатынын елестетіп көріңіз:

factUsingRecursion(3);

Егер:

3*factUsingRecursion(2)
3*2*factUsingRecursion(1)
3*2*1

Жоқ болса:

3*factUsingRecursion(2)
3*2*factUsingRecursion(1)
3*2*1*factUsingRecursion(0)
3*2*1*0*factUsingRecursion(-1)
3*2*1*0*-1*factUsingRecursion(-2)
3*2*1*0*-1*-2*factUsingRecursion(-3)
...
And so on... It will not stop until you encounter the StackOverflow error
2
қосылды
@ user2341013 Сізді құттықтаймыз. btw, StackOverflow-де бір ғана жауапты (жасыл құптау белгісін) қабылдай аласыз, сол себепті сізге ең көп көмектесті. Қалағаныңызша қанша жауап беруіңізге болады (жоғары көрсеткі).
қосылды автор Paulpro, көзі
Көп рақмет. Қазір ол өте айқын. Жедел әрекетіңізді бағалаңыз!
қосылды автор user2341013, көзі
Әрине, мен оны алдым. Рақмет сізге. Бұл жағдайда барлық жауаптар маған көмектесті;)
қосылды автор user2341013, көзі

Рекурсия негізгі жағдайды талап етеді. Онсыз бұл функцияны қайта-қайта шақырады және ешқашан тоқтамайды. If if statement базалық жағдайда, ол рекурсияны тоқтатады. Сондықтан оны жойсаңыз, сіз StackOverflowError аласыз.

2
қосылды
Неге бұл жауап төмендеді?
қосылды автор rgettman, көзі

return нөмірі * factUsingRecursion (сан - 1) және factUsingRecursion (number - 1) Мұнда қайтару нөмірі * factUsingRecursion (сан - 1) деп бірдей қайтару болады. Сіздің функцияңыз үнемі өзін-өзі шақырады, ешқашан ештеңеге баға бере алмайсыз. Шартты орнату арқылы сіз функция рекурсивті тізбектің бір нүктесінде түпкілікті мәнге баға бере аласыз және бірінші қоңырауды бағалауға болады.

1
қосылды

Ол рекурсивті функцияны рекурсивтілдіретін заттардың бірін жоғалтады, себебі оның шығу күйі жоқ.

Барлық рекурсивті шешімдер үш ережені немесе қасиеттерді қанағаттандыруы керек: Рекурсивтік шешім базалық жағдайда болуы керек. Рекурсивті шешімде рекурсивті жағдай болуы керек. Рекурсивтік шешім базалық жағдайда прогреске жету керек.

Қайдан: Python көмегімен деректер құрылымдары және алгоритмдер

1
қосылды

Әрбір бүтін i үшін сіз функцияны i -1 деп шақырасыз. Integersa шексіз, сондықтан сіз функцияны ешқашан тоқтатпаңыз. Мысалы: -1000 -1001-ке қоңырау шалады және бұл JVM-дің кеңістігінде бірнеше орын болғанша жалғасады.

0
қосылды