Паскаль: рекурсивні означення та підпрограми, Детальна інформація

Паскаль: рекурсивні означення та підпрограми
Тип документу: Реферат
Сторінок: 7
Предмет: Комп`ютерні науки
Автор: Олексій
Розмір: 0
Скачувань: 1045
function C(m, n : integer) : integer;

begin

if (m<=1) or (n=0) or (n=m) then C:=1

else C:= C(m-1, n-1)+C(m-1, n)

end;

Як бачимо, кожний виклик, у якому значення аргументів m>1, 0
8

°

E

TH

i

E

"

I викликів, то треба більше 1000 секунд, тобто приблизно 20 хвилин. Проте неважко написати рекурсивну функцію, виклик якої з аргументом m породжує не більше, ніж m/2 вкладених викликів (задача 9.7).

Отже, вживання рекурсивних підпрограм вимагає обережності та вміння оцінити можливу глибину рекурсії та загальну кількість викликів. Не завжди слід писати рекурсивні підпрограми безпосередньо за рекурсивним означенням. Принаймні, для обчислення біноміальних коефіцієнтів узагалі краще скористатися циклом (розділ 5.2). Справа в тім, що виконання кожного виклику підпрограми потребує додаткових дій комп'ютера, описаних у розділі 8. Тому "циклічний" варіант описання обчислень виконується, як правило, швидше від рекурсивного. Також не слід уживати рекурсію для обчислення елементів рекурентних послідовностей. За великої глибини рекурсії це взагалі може призвести до вичерпання автоматичної пам'яті та аварійного завершення програми.

У цьому розділі ми розглядаємо лише так звану пряму рекурсію, коли підпрограма містить виклики самої себе. У програмуванні зустрічається також і непряма рекурсія, коли підпрограма містить виклики інших підпрограм, а ті – виклики цієї підпрограми. Приклади непрямої рекурсії та реалізацію її в мові Паскаль ми розглянемо в розділі 21.

Задачі

4.* Виразити словами залежнiсть значення, що повертається функцією

function sumdi ( n : integer ) : integer;

begin

if n < 10 then sumdi := n

else sumdi := n mod 10 + sumdi ( n div 10 )

end,

від значення параметра. Вважається, що аргумент у її виклику невід'ємний.

5.* Написати процедуру друкування десяткових цифр цілого

а) у зворотному порядку, починаючи з молодших розрядів;

б) у звичайному порядку, починаючи зі старших розрядів.

6. Написати функцію обчислення за m, n, де 0\xF0A3 n\xF0A3 m, біноміального коефіцієнта C(m,n) згідно з палимо, що C(m,n)=1 при n=0 або n=m; у противному разі

а) C ( m, n ) = C ( m-1, n-1 ) \xF0A0 m / n;

б) C ( m, n ) = C ( m, n-1 ) \xF0A0 ( m-n+1 ) / n;

The online video editor trusted by teams to make professional video in minutes