Sign in Join
Wiki copytemporary

Basic Pascal Tutorial/Chapter 4/Programming Assignment/bg: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
114G - Programming Assignment (author: Tao Yue, state: unchanged)
22
33Класически проблем с рекурсията, преподаван във всички уводни курсове по компютърни науки, е Кулите на Ханой. В този проблем имате три вертикални колчета. В най-левия кол има конусовидна кула, състояща се от поредица дискове с форма на поничка. Например, така изглежда четириетажната кула:
44
5-`   |       |       |`\
6-`   |       |       |`\
7-`   *       |       |`\
8-`  ***      |       |`\
9-` *****     |       |`\
10-`*******    |       |`
5+```
6+ | | |
7+ | | |
8+ * | |
9+ *** | |
10+ ***** | |
11+******* | |
12+```
1113
1214Колчетата са означени 1, 2 и 3 отляво надясно. Предизвикателството е да преместите кула (с всякаква височина) от колче 1 към колче 3. В процеса не може да се поставя голям диск върху по-малък диск и може да се премести само един диск (най-горният диск на колче) по всяко време.
1315
1416Проблемът изглежда тривиален за един или два диска. За един диск просто го премествате от колче 1 в колче 3. За два диска преместете най-горния диск от колче 1 в колче 2, след това 1 в 3 и накрая преместете по-малкия диск от 2 в 3.
1517
1618Проблемът се усложнява за три или повече диска. За три диска бихте преместили 1 на 3, след това 1 на 2, след това 3 на 2. Това ефективно създава двуетажна кула на колче 2. След това преместете най-големия диск: 1 на 3. Сега преместете двуетажната кула на върха на големия диск: 2 към 1, 2 до 3, 1 до 3.
1719
1820Вашата задача, ако решите да я приемете - е да напишете програма, използвайки рекурсивна процедура за решаване на Кулите на Ханой за произволен брой дискове. Първо попитайте потребителя за височината на оригиналната кула. След това разпечатайте инструкции стъпка по стъпка за преместване на отделни дискове от едно колче на друго. Например проблем с три диска трябва да доведе до следния изход:
1921
20-`1 to 3`\
21-`1 to 2`\
22-`3 to 2`\
23-`1 to 3`\
24-`2 to 1`\
25-`2 to 3`\
26-`1 to 3`
22+```
23+1 to 3
24+1 to 2
25+3 to 2
26+1 to 3
27+2 to 1
28+2 to 3
29+1 to 3
30+```
2731
2832Както е посочено в раздела за [[Basic Pascal Tutorial/Chapter 4/Recursion/bg|рекурсия]], рекурсията е една от най-трудните за разбиране теми. Някои хора ще разгледат този проблем и ще открият че е изключително лесен за решаване. Други ще имат много проблеми с него. Въпреки това, след като успеете да разбирете принципа на рекурсията, действителното писане на програмата е сравнително просто.
2933
3034Така че ако искате да се предизвикате, спрете да четете сега. Ако имате проблеми, продължете да четете за малко *подсказване*.
3135
3236*Подсказка*: проблемът, както всички рекурсивни проблеми, намалява, като става по-опростен с всяка стъпка. Помните ли проблема с три диска? Първо създавате двудискова кула на колче 2, което ви позволява да преместите най-долния диск на колче 1 към колче 3. След това премествате двудисковата кула върху колче 3.
3337
3438Същото е и с четири диска. Първо създайте кула с три диска на щифт 2, след това преместете най-големия диск на кол 3 и преместете кулата с три диска на кол 3. Как се създава кулата с три диска? Просто. Вече знаем как да преместваме кула с три диска от колче 1 в колче 3. Този път просто се придвижвате от колче 1 към колче 2, след което когато най-голямото колче е на мястото си, вие премествате кулата от колче 2 до кол 3. В цялата тази процедура можем да действаме така, сякаш големият диск не съществува, тъй като гарантирано е по-голям от останалите и по този начин не създава проблем. Просто използвайте решението с три диска, като превключвате числата.
3539
3640На добър час!
3741
3842---
3943*From the Free Pascal wiki, page "Basic Pascal Tutorial/Chapter 4/Programming Assignment/bg", as it stood on 2022-08-20 after a change by Kai Burghardt, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history