Искусство программирования на Си (984073), страница 30
Текст из файла (страница 30)
которую можно использовать рскурсивно. Убслитссгь 08 09 Примср корректной реализации программы (ой2 что у нсе нет "внутреннего состояния", которое может 10 (нггнрп(гнр, [бьь[0121456780,(бщ!) == нггьнп(Свр) 46 прсдсзавлсн пол илеснсле 1083.0. Эта программа исполь- проявиться.
Она должна полностью полагаться на пс- 11 нсгсьг(свр, ',')) ( зуст функцию, эквивалснтнукз бсрклисвской ф>нкции рсмснныс с автоматичсским выдслсннсм памяти и на 12 Спх(я, [бЫ),[ббь!); 5(гэср(В под новым имснсм веря!ГО. Прсдлагаю вам ис- свои арг>мснты и возвращать тс значения, которые вам 13 ) е1ве ) ве поль ювать эту ф>нкцию в своих программах; она, в нсобхолимо знать для послслуюшсго обращения к ной. 14 рг)пгг([бьь)Сохнпе Сн>п[бьь), Свр); 15 ) прннпнпс, эквивалсеина стандартнон, хотя, возможно, На тот случаи, сели у вас нот доступа к ечсЬ-сайт> 16 Свр - нггСох(деЬГч ан)ьн); нс столь изящна, как сс аналог в бсрклисвскон всрсии издательства "ДиаСофт", примср рсализапин ьерв(гО 17 оган;юртной библиозски С.
Почему она называется прсдстапзсн в листингс (О.! ! 18 ) вера!г, а нс 51гаеру Потому что в стандартс С зарсзсрви- Листинг 10.11. Функция аер61г(). Проследим за выполнснисм програмлпл. Начнем сна- ласт значение своего внутреннего слсдующсго указатс сваг * !!сргсноянр~ нннн яшя С ЯД Часть ! ласт на нулевой указшсль, функция нс может слслать лиотскс, то >видите, что достаточно поставить се на Резюме ничего полезного, поэзому она такмсе возврашает н>ле- место яерятг(), и больше ничего не надо л1снять. (Если вой указатель.
Помните, что опсраторлогического ИЛИ только вам не попадется система, в которой функция В этой главе вы узнали, чзо такое рекурсия, как опа в языке С подобен короткому замыканию; если при а!гаер() будет совсем не такой, как в др>гих системах. действует и лля решения каких проблем сс можно испсрвой жс проверке обнар>жена несостоятельность ар- Это может звучать нег|равлоподобно, но изредка !акое пользовать. Бь!ли рассмотрены примеры, демонстриругумснтов, вторая проверка даже нс начинасзся. Почто- происходит в расширениях языка.) юшис суть действия рекурсии, а также примеры нсцсму безопасно проверять *я, котла известно, что з нс яв- лссообразного использования рекурсии.
Мы показали ляется нулевым Указателем. После проведения этих ПрщТИЧЕО(ОЕ ПРИМЕНЕНИЕ рЕ)(урмии пару ловушек, ко!орые с>шествуют в рекурсивных копровсрок сохраняем возвращаемое значс1!ис. Вне зави- дах. Теперь вы сможете сделать разумный выбор мсжсимости от того, что произойдет, возврашасл!ая лексе- Рекурсии целесообразно применять в задачах, которые д> рекурсией и итерацией в конкретных задачах. Если ма всегда будет начинаться с нач;ша строки.
можно разбить на множеспю меньших подобных задач. в!я хотитс больше узнать об этом, попробуйте написать После этого нужно применить функцию з!гсярпО Но если эти лзсньшис задачи б>д>т существенно отлинссколько тестовых програмлн и посмотрстгн как они чтобы определить, в каков части строки не использ>- чазься др>г от друга, вероятно, итерация окажсзся по- работают. Конечно, также рекомендуется обратиться к ются символы из !)е))вь Ес имя происходит от словосо- лезнес рекурсии.
Иногда лучших~ способом является стандартной литерат>рс, такой как книга Кнута (Кпшп) чстания сотр1ен~енг храп (лополнитсльный диапазон): комбинация: рекурсивный алгоритм разбивает задач> на "Тйс Лг! о) Согпрц!сг Ргоягагппппа". она возврашаез длину на пльнон подстроки до первого чаши, с которыми работает итсраппонный код. Если у вас появится желание полробнее ознакомить- аргу'чснта, который определяет диапазон (т.с, полнос- Класснчсским примером использования рек>рсии ся с концепцией рекурсии, включая некоторыс нскомтью состо>ы из элементов, он1сунктнеуон!их во второи являсзся, вероятно, синтаксический анализ. Проще гоаргумснзс).
Если первый символ после этого диапазона вора синтаксический анализ по своей природе нялнесн пьютсрные ситуации, в хозорых она проявляется, прочитайтс книгу Дугласа Хофстазтсра (Е>овк)аз Но(масйсг) "Сог)е1, Еьс1>ег, ВасЬ". г)ел< л>чшс вы познастс суть рек>рсии, тем эффективнее сможете использовать се в программировании. Если вы хотитс еше поразмышлять о рекурсии, вот вам задача. Я дока~ад, что использовать рскхрсивн>ю функцию для чтения входных данных нецелесообразно, а лля синтаксичсского аназиза это самый полходяшии метод. Если ваша рекурсивная анализир>юшая программа вызывает функцию лля чтения вхолнь!х ланнь!х, это хорошо или плохо? Если цзохо, то чем этот способ действительно отличается от рекурсивного чтения входных данных? Я задавал эти вопросы некоторым достаточно опытным про!раммнстам и получил очень интсрссныс ответы.
Заявите зги вопросы своим друзьям Простые абстрактные структуры данных Организация данных в этой глдвк ° Мдссивы ° Односвязныс списки ЧАСТЬ Ричард Хэзфилд ° Двусвязные списки ° Циклические списки Е Стеки ° Очереди ° Очереди по приоритету ° Двусторонние очереди (век|О : ' "-:: '.у !::;",!:;,."з ф",.".;!'.,дт;. С; -: ч!;" т:се е *'„:",: с ея 'в',те'",~:,'''* д '... ц т'.,".:.;.'. «' .. '» *' з (" ...,ф / и / 1 ;"* ф ;: ". и„";",,"„'.„,':;е:"; д "с "-:": *',.' "!.',"*ы ";;" , 'д / ' '*'« ' »'*' » *'' «, ''е ;"в "',дс: В "";...,:„"" "'"' ..:. 'з,'...! .,* „„..::.*~;"т '... :"": - .::С:.:.'к:;.
"'."-.,:, т':~;;т: '".'":, ,"д* ",,"и,' -*,"" т "и т'„' р е д;; ' .. д "к; ' с",;.:.,д "', я;.,:д.*,.з ("''*, ',, *, ' ' с",;„*,з р '"д т;: ., ",ч";з "С :!:.;пес:ттч.::с: и'Ч " и!.,".я. " '":: "".... '"ч Нры ыыаобгырагтхыегарулыурыбилпыг Глава 11 В настоящей 0лаве рассматривается большинство Давайте жс теперь начнем с наиболее знакомоп, воря уже о том, умеют ли они вообще компилировать лпе свеогбегп(оввай ьгнв кчассичсскил структур данных, но деревья не влодят в мошной и в значительной степени нелооцениваемои программы. Таким образом, на вас возлагается задача плге Г нахкпгг)еа) это число, потому что они заслуживают отдельнои гла- структуры данных — с массива. сопровождения и молификации гной программы всякий ( вы (фактически даже нескольких глав). Здесь будут раз, когда пользователю булез мешать произвольно ус- влге е л; описаны способы обобщения понятий классичсскил ~Щ~Щ~ц тановлсннос ограничение размера л<ассива.
А это постав- 1пг соедпогдег = 1; структур данных, с тем чтобы отделить гтруктурл дан- ляет лишнис неудобства вашим заказчикам. (ог(1 = 01 л < нахнпгглеа лл согапогдег1 ных от реальных данных Действительно, ведь лолжна Массив — это не просто структура данных; это также (л+) жс существовать вгмможность составить список полу- механизм языка, который позволяет адресовать множс- Одномерные массивы фиксированного размера Соедпсгдег = Сееспвсгдвг(ьсгйегАггау[1))1 пок, нс объясняя списку, чзо такое печеные бобы, или ство подобных объектов в простом цикле.
Массивы зас- Олномерныс массивы, несомненно, являются самыми печеным бобам — что закос списки. Муя коснемся так- луживают пристального изучения по той причине, что распространенными. Нет необходимости рассматривать гегпгп же поншив инкапсуляции (объединения данных с их принципы работы с ними могут быть использованы лля их здесь очень полробно, поскольку они относительно 1 функциональным назначением), но нс получайте. по- реализации любви классической структуры данных. просты.
Но все же следуез, по-видимому, напомнить, Этот код уже лучше Здесь все еще остается цроблежалуйста, что эта глава об объектно-ориснтированнол~ Вас можст удивить тот факт, что массивы, состав- что язык С не позволяет програлзл~ист>' перелавать мас- ма связанная с фиксированным размером массива, но программировании (ООП).
Это нс так. Тел~ нс монсе, ляя одно из осно~юполагаюших понятии языка С, под- оив в функцию. Что можно перелаз ь в лсйствитсльнос- мы пока нс будем ею заниматься. нскоторыс принпнпы ООП исключительно хорошо под- робно рассматриваются в книге, которая самым опрс- ти, так это значение указателя на первый элемент мас- Поскольку компилятор знает размер типа ходят зщя проектирования структур данных на языке С, деленным образом предназначена нс для начинающил сива.