25.07.2017 Views

Intro-CSharp-Book-v2015

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Глава 23. Как да решаваме задачи по програмиране? 941<br />

задачи се крие в това да овладеете добре техниката на разбиването на<br />

задачата на по-прости подзадачи и, разбира се, да се научите да ви хрумват<br />

добри идеи, което става с много, много практика.<br />

Сложните проблеми винаги могат да се разделят на<br />

няколко по-прости. Когато решавате задачи, разделяйте<br />

сложната задача на няколко по-прости задачи, които<br />

можете да решите самостоятелно.<br />

Разбъркване на тесте карти – пример<br />

Нека дадем един пример: трябва да разбъркаме тесте карти в случаен ред.<br />

Да приемем, че тестето е дадено като масив или списък от N на брой обекти<br />

(всяка карта е обект). Това е задача, която изисква много стъпки (някаква<br />

серия от изваждания, вмъквания, размествания или преподреждания на<br />

карти). Тези стъпки сами по себе си са по-прости и по-лесни за реализация,<br />

отколкото цялостната задача за разбъркване на картите. Ако намерим<br />

начин да разбием сложната задача на множество простички стъпки, значи<br />

сме намерили начин да я решим. Именно в това се състои алгоритмичното<br />

мислене: в умението да разбиваме сложен проблем на серия по-прости<br />

проблеми, за които можем да намерим решение. Това, разбира се, важи не<br />

само за програмирането, но и за решаването на задачи по математика,<br />

физика и други дисциплини. Точно алгоритмичното мислене е причината<br />

математиците и физиците много бързо да напредват, когато се захванат с<br />

програмиране.<br />

Нека се върнем към нашата задача и да помислим кои са елементарните<br />

действия, които са нужни, за да разбъркаме в случаен ред картите?<br />

Ако хванем в ръка тесте карти или си го нарисуваме по някакъв начин на<br />

лист хартия (например като серия кутийки с по една карта във всяка от<br />

тях), веднага ще ни хрумне идеята, че е необходимо да направим някакви<br />

размествания или пренареждания на някои от картите.<br />

Разсъждавайки в този дух стигаме до заключението, че трябва да направим<br />

повече от едно разместване на една или повече карти. Ако направим само<br />

едно разместване, получената подредба няма да е съвсем случайна.<br />

Следователно ни трябват много на брой по-прости операции за единични<br />

размествания.<br />

Стигнахме до първото разделяне на задачата на подзадачи: трябват ни<br />

серия размествания и всяко разместване можем да разгледаме като попроста<br />

задача, част от решението на по-сложната.<br />

Първа подзадача: единично разместване<br />

Как правим "единично разместване" на карти в тестето? На този въпрос има<br />

стотици отговори, но можем да вземем първата идея, която ни хрумва. Ако<br />

е добра, ще я ползваме. Ако не е добра, ще измислим друга.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!