Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования Π‘ΠΈ. ИзданиС 3-Π΅, исправлСнноС». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 25

Автор Π‘Ρ€Π°ΠΉΠ°Π½ ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½

int x;

int y;

f(double Ρ…)

{

 double y;

}

x Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f рассматриваСтся ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° double, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π²Π½Π΅ f это внСшняя пСрСмСнная Ρ‚ΠΈΠΏΠ° int. Π’ΠΎ ΠΆΠ΅ самоС ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈ ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ y.

Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния стиля программирования, Π»ΡƒΡ‡ΡˆΠ΅ Π½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ΄Π½ΠΈΠΌΠΈ ΠΈ Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ для Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ слишком Π²Π΅Π»ΠΈΠΊΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρ‹ ΠΈ появлСния ошибок.

4.9 Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ

ΠœΡ‹ ΡƒΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π· ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ ΠΎΠ± ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π½ΠΎ всСгда лишь ΠΏΠΎ ΡΠ»ΡƒΡ‡Π°ΡŽ, Π² Ρ…ΠΎΠ΄Π΅ обсуТдСния Π΄Ρ€ΡƒΠ³ΠΈΡ… вопросов. Π’ этом ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅ ΠΌΡ‹ суммируСм всС ΠΏΡ€Π°Π²ΠΈΠ»Π°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ памяти Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… классов.

ΠŸΡ€ΠΈ отсутствии явной ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ для Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΈ статичСских ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… гарантируСтся ΠΈΡ… ΠΎΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅; автоматичСскиС ΠΈ рСгистровыС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния ("мусор").

БкалярныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΈΡ… опрСдСлСниях, помСщая послС ΠΈΠΌΠ΅Π½ΠΈ Π·Π½Π°ΠΊ = ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:

int Ρ… = 1;

char squote = '\'';

long day = 1000L * 60L * 60L * 24L; /* дСнь Π² миллисСкундах */

Для Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΈ статичСских ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ выраТСния Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ константными, ΠΏΡ€ΠΈ этом инициализация осущСствляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ автоматичСских ΠΈ рСгистровых ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… выполняСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊ. Для Ρ‚Π°ΠΊΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ - Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ константноС. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ любоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ значСния, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π΄Π°ΠΆΠ΅ ΠΈ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. НапримСр, Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска, описанной Π² ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅ 3.3, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

int binsearch(int Ρ…, int v[], int n)

{

 int low = 0;

 int high = n-1;

 int mid;

}

Π° Π½Π΅ Ρ‚Π°ΠΊ:

int low, high, mid;


low = 0;

high = n - 1;

Π’ сущности, инициализация автоматичСской ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ - это Π±ΠΎΠ»Π΅Π΅ короткая запись инструкции присваивания. Какая запись ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅ - Π² большой стСпСни Π΄Π΅Π»ΠΎ вкуса. Π”ΠΎ сих ΠΏΠΎΡ€ ΠΌΡ‹ пользовались Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ явными присваиваниями, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ инициализация Π² ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡΡ… ΠΌΠ΅Π½Π΅Π΅ Π·Π°ΠΌΠ΅Ρ‚Π½Π° ΠΈ дальшС отстоит ΠΎΡ‚ мСста использования ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

Массив ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π΅Π³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки списка ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ², Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… запятыми. НапримСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив days, элСмСнты ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡΡƒΡ‚ΡŒ количСства Π΄Π½Π΅ΠΉ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ мСсяцС, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ:

int days[] = {31, 28, 31, 30, 31, 30, 31. 31, 30, 31, 30, 31};

Если Ρ€Π°Π·ΠΌΠ΅Ρ€ массива Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, Ρ‚ΠΎ Π΄Π»ΠΈΠ½Ρƒ массива компилятор вычисляСт ΠΏΠΎ числу Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ²; Π² нашСм случаС ΠΈΡ… количСство Ρ€Π°Π²Π½ΠΎ 12.

Если количСство ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² мСньшС числа, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π΄Π»ΠΈΠ½Ρ‹ массива, Ρ‚ΠΎ для Π²Π½Π΅ΡˆΠ½ΠΈΡ…, статичСских ΠΈ автоматичСских ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ элСмСнты Π±ΡƒΠ΄ΡƒΡ‚ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌΠΈ. Π—Π°Π΄Π°Π½ΠΈΠ΅ слишком большого числа ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² считаСтся ошибкой. Π’ языкС Π½Π΅Ρ‚ возмоТности Π½ΠΈ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ повторСния ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, Π½ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ срСдниС элСмСнты массива Π±Π΅Π· задания всСх ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… массивов - особый случай: вмСсто конструкции с Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹ΠΌΠΈ скобками ΠΈ запятыми ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ строку символов. НапримСр, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° такая запись:

char pattern[] = "ould";

ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ собой Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ эквивалСнт записи

char pattern[] = {'ΠΎ', 'u', 'l', 'd', '\0'};

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Ρ€Π°Π·ΠΌΠ΅Ρ€ массива Ρ€Π°Π²Π΅Π½ пяти (Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… символа ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉ символ '\0').

4.10 РСкурсия

Π’ Π‘ΠΈ допускаСтся рСкурсивноС ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ функциям, Ρ‚. Π΅. функция ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ сама ΠΊ сСбС, прямо ΠΈΠ»ΠΈ косвСнно. Рассмотрим ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ числа Π² Π²ΠΈΠ΄Π΅ строки символов. Как ΠΌΡ‹ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ Ρ€Π°Π½Π΅Π΅, Ρ†ΠΈΡ„Ρ€Ρ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС - младшиС Ρ†ΠΈΡ„Ρ€Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ΡΡ Ρ€Π°Π½ΡŒΡˆΠ΅ ΡΡ‚Π°Ρ€ΡˆΠΈΡ…, Π° ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒΡΡ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ двумя способами. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ - Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ Ρ†ΠΈΡ„Ρ€Ρ‹ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ массивС Π² Ρ‚ΠΎΠΌ порядкС, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π»ΠΈΡΡŒ, Π° Π·Π°Ρ‚Π΅ΠΌ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ ΠΈΡ… Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС; Ρ‚Π°ΠΊ это ΠΈ Π±Ρ‹Π»ΠΎ сдСлано Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ itoa, рассмотрСнной Π² ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅ 3.6. Π’Ρ‚ΠΎΡ€ΠΎΠΉ способ - Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ рСкурсиСй, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ printd сначала Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ сСбя, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ всС ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ Ρ†ΠΈΡ„Ρ€Ρ‹, ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ послСднюю ΠΌΠ»Π°Π΄ΡˆΡƒΡŽ Ρ†ΠΈΡ„Ρ€Ρƒ. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ Π΅Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΏΡ€ΠΈ использовании самого большого ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ числа Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

#include β€Ήstdio.hβ€Ί


/* printd: ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ n ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅ дСсятичноС число */

void printd(int n)

{

 if (n β€Ή 0) {

  putchar('-');

  n = -n;

 }

 if (n / 10)

  printd(n / 10);

 putchar(n % 10 + '0');

}

Когда функция рСкурсивно обращаСтся сама ΠΊ сСбС, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ сопровоТдаСтся ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ Сю Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° автоматичСских ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, нСзависимых ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Π½Π°Π±ΠΎΡ€ΠΎΠ². Π’Π°ΠΊ, Π² ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ printd(123) ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ n = 123, ΠΏΡ€ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΌ - printd ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ 12, ΠΏΡ€ΠΈ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ - Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1. Ѐункция printd Π½Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ 1 ΠΈ возвращаСтся Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ, послС Ρ‡Π΅Π³ΠΎ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ Ρ†ΠΈΡ„Ρ€Ρƒ 2 ΠΈ возвращаСтся Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ. Π—Π΄Π΅ΡΡŒ ΠΎΠ½Π° ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ 3 ΠΈ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ рСкурсии - это быстрая сортировка, прСдлоТСнная Π§.А.Π . Π₯ΠΎΠ°Ρ€ΠΎΠΌ Π² 1962 Π³. Для Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ массива выбираСтся ΠΎΠ΄ΠΈΠ½ элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ элСмСнты Π½Π° Π΄Π²Π° подмноТСства - Ρ‚Π΅, Ρ‡Ρ‚ΠΎ мСньшС, ΠΈ Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π½Π΅ мСньшС Π½Π΅Π³ΠΎ. Π’Π° ΠΆΠ΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° рСкурсивно примСняСтся ΠΈ ΠΊ Π΄Π²ΡƒΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ подмноТСствам. Если Π² подмноТСствС ΠΌΠ΅Π½Π΅Π΅ Π΄Π²ΡƒΡ… элСмСнтов, Ρ‚ΠΎ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅Ρ‡Π΅Π³ΠΎ, ΠΈ рСкурсия Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ.

Наша вСрсия быстрой сортировки, разумССтся, Π½Π΅ самая быстрая срСди всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ…, Π½ΠΎ Π·Π°Ρ‚ΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· самых простых. Π’ качСствС дСлящСго элСмСнта ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ сСрСдинный элСмСнт.

/* qsort: сортируСт v[left]…v[right] ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ */

void qsort(int v[], int left, int right)

{

 int i, last;

 void swap(int v[], int i, int j);


 if (left β€Ί= right) /* Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ дСлаСтся, Ссли */

  return; /* Π² массивС ΠΌΠ΅Π½Π΅Π΅ Π΄Π²ΡƒΡ… элСмСнтов */

 swap(v, left, (left + right)/2); /* дСлящий элСмСнт */

 last = left; /* пСрСносится Π² v[0] */

 for(i = left+1; i β€Ή= right; i++) /* Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° части */

  if (v[i] β€Ή v[left])

   swap(v, ++last, i);

 swap(v, left, last); /* ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ дСлящий элСмСнт */

 qsort(v, left, last-1);

 qsort(v, last+1, right);

}

Π’ нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ опСрация пСрСстановки ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½Π° Π² Π²ΠΈΠ΄Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (swap), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ встрСчаСтся Π² qsort Ρ‚Ρ€ΠΈΠΆΠ΄Ρ‹.

/* swap: ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ мСстами v[i] ΠΈ v[j] */

void swap(int v[], int i, int j)

{

 int temp;

 temp = v[i];

 v[i] = v[j];

 v[j] = temp;

}

Бтандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈΠΌΠ΅Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ qsort, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΡƒΡŽ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ любого Ρ‚ΠΈΠΏΠ°.

РСкурсивная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ обСспСчиваСт Π½ΠΈ экономии памяти, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ трСбуСтся Π³Π΄Π΅-Ρ‚ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ стСк Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅, Π½ΠΈ быстродСйствия; Π½ΠΎ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ со своим нСрСкурсивным эквивалСнтом ΠΎΠ½Π° часто ΠΊΠΎΡ€ΠΎΡ‡Π΅, Π° часто Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π»Π΅Π³Ρ‡Π΅ для написания ΠΈ понимания. Π’Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ особСнно ΡƒΠ΄ΠΎΠ±Π½Ρ‹ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ рСкурсивно опрСдСляСмых структур Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ€ΠΎΠ΄Π΅ Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π²; с Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Π½Π° эту Ρ‚Π΅ΠΌΡƒ Π²Ρ‹ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚Π΅ΡΡŒ Π² ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅ 6.5.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 4.12. ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΈΠ΄Π΅ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ использовали Π² printd, для написания рСкурсивной вСрсии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ itoa; ΠΈΠ½Π°Ρ‡Π΅ говоря, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠΉΡ‚Π΅ Ρ†Π΅Π»ΠΎΠ΅ число Π² строку Ρ†ΠΈΡ„Ρ€ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСкурсивной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 4.13. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reverse(s), ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ элСмСнты строки Π² Ρ‚Ρƒ ΠΆΠ΅ строку Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС.

4.11 ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ языка Π‘ΠΈ

НСкоторыС возмоТности языка Π‘ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ прСпроцСссором, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ шагС компиляции. НаиболСС часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Π²Π΅ возмоТности: #include, Π²ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ содСрТимоС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π²ΠΎ врСмя компиляции, ΠΈ #define, Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‰Π°Ρ ΠΎΠ΄Π½ΠΈ тСкстовыС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅. Π’ этом ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅ ΠΎΠ±ΡΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ условная компиляция ΠΈ макроподстановка с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ.

4.11.1 Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°

БрСдство #include позволяСт, Π² частности, Π»Π΅Π³ΠΊΠΎ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ #define ΠΈ объявлСний. Π›ΡŽΠ±Π°Ρ строка Π²ΠΈΠ΄Π°

#include "имя-Ρ„Π°ΠΉΠ»Π°"

ΠΈΠ»ΠΈ

#include ‹имя-Ρ„Π°ΠΉΠ»Π°β€Ί

замСняСтся содСрТимым Ρ„Π°ΠΉΠ»Π° с ΠΈΠΌΠ΅Π½Π΅ΠΌ имя-Ρ„Π°ΠΉΠ»Π°. Если имя-Ρ„Π°ΠΉΠ»Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ, Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ„Π°ΠΉΠ» ищСтся срСди исходных Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹; Ссли Ρ‚Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Π½Π΅ оказалось ΠΈΠ»ΠΈ имя-Ρ„Π°ΠΉΠ»Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ Π² ΡƒΠ³Π»ΠΎΠ²Ρ‹Π΅ скобки β€Ή ΠΈ β€Ί, Ρ‚ΠΎ поиск осущСствляСтся ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ. Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹ΠΉ Ρ„Π°ΠΉΠ» сам ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π² сСбС строки #include.