Как да се научат да пишат рекурсивни алгоритми - стека преливане на Руски

Как да се развива рекурсивни мисленето на нивото, на което би било лесно да се решават проблеми, като например отнемане на само тези елементи на двоично дърво, което може да се види от върха, а другият е лесно да се напише рекурсивни алгоритми, като например динамично програмиране?

Google е само глупости, примитивно обяснение за "Кадъ Karatch рекурсия е функцията нарича себе си)))". По-малко вероятно да се получи информация за това как да се използва стека, когато рекурсивни процедурата, но това знание не увеличава способността да пишат рекурсивни алгоритми.

Решения на няколко проблеми на рекурсия с hakerranka дойдох интуитивно, и аз искам да се развие способността за решаване на проблема в произволна рекурсия съзнателно. Как да се постигне това?

примитивен, твърде лесно, и разбирането им не се развива способността за решаване на дадена задача рекурсивно.

Въпреки това, математическа индукция не ми помогне точно сега, за да реши проблема топ изглед. Изглежда е имало липса на разбиране за същността на проблема. Аз съм се предположи, че съветници създават илюзията за разбиране рекурсия, защото те могат да пишат от сливането памет вид. Но в непознатите проблеми е вероятно те да се слеят, защото те могат да пишат само решение, известни със задачи. Искам да се науча как да се реши някакъв проблем и рекурсивно представлява процесът на извършване на рекурсивни функции. - typemoon 04 март '16 в 13:36

Човек може да си представим, че рекурсивно функция е вече написана. В решаването на проблема, за да го използвате, тъй като тя вече е написана. След това се уверете, че има гранични условия, при които спира рекурсията.

Да предположим, че имаме следния проблем: да се намери броя на възможните начини за обмен на $ 100 монети от 10 рубли, 5 рубли, 2 рубли и 1 рубла.

Това означава, че трябва да напише функция е (количество nabor_monet), което можем да наречем като: резултат = F (100, [10, 5, 2, 1]). Първият аргумент - сумата, която трябва да се промени, а вторият - списък на уникалните монети, които могат да се използват за осигуряване на тази сума.

Представете си, че функцията F вече е писано. Както вече можем да се възползваме от него? Ключова точка: мисли за варианти начин на разделяне, за предпочитане прости.

Например, обърнете внимание, че $ 100 може да бъде заменен с помощта на десет, като монети и без използването на десет монета. Тази идея може да се каже е решение на проблема.

Сумата от тези опции ще бъде равен на необходимия брой. След изпълнението на функцията F могат да бъдат написани като сумата на рекурсивни повиквания към себе си, за да "скъсен" аргумент: F (90, [1, 2, 5, 10]) + F (100, [1, 2, 5]).

F (90, [1, 2, 5, 10]) - имаме един вид "взети" монета от десет-100, но не ограничават избора на допълнителни монети;

F (100, [1, 2, 5]) - ние не взема нищо от сумата но ограничен набор от монети.

И двата термина са наречени рекурсивно. По този начин се вижда, че броят на варианти ще намалее с всяко рекурсивно повикване.

Остава да добавим на граничните условия, че функцията не се нарича безкрайна. За да направите това, трябва да се определи дали никакви аргументи връща 1, и при какви - 0.

За решаване на проблема (във всяка област) изисква познания и практика.
В този случай е необходимо да се овладеят курс на базата на алгоритъма: прочетете (или да слушате) и за решаване на повече от един проблем.

Като такъв курс може да препоръча една книга Седжуик. Алгоритми в C ++. Основните алгоритми и структури от данни. (Тъй като има варианти на тази книга за C и Java). В него, по-специално, има глава, посветена на рекурсия, и много упражнения.

След като научава основите на възможността да избират по-оптимално решение идва с опита.

Отговорено 04 март '16 в 14:06

"В този случай, вие искате да овладеят основите на алгоритмите на курса" Вашето твърдение е невярно. Учил съм и изпълнява много алгоритми може да напишете няколко вида памет дървета, сортиране, система от несвързани подгрупи, SQRT-разлагане и т.н., и отгоре не може да реши. - typemoon 04 март '16 в 14:09

@typemoon - Не се притеснявай. Това зле дефинирано задача. - Игор 4 март '16 в 14:11

Не, същността на проблема е ясно, но как да се използва рекурсия тук - не е ясно. Някои от моите изводи не се прави това, което трябва, или изход всички елементи на дървото. - typemoon 04 март '16 в 14:14

Имаме нужда от две различни рекурсивни функции. - по един за лявата страна на дървото, а другият - в дясно. Те ще се различават само по мястото, в което стойността на продукцията на върха. В единия случай ще се отпечата след рекурсивно повикване, а от друга - да. - zverkov 04 март '16 в 14:19