ВУЗ:
Составители:
Рубрика:
213
Решение. В силу законов ассоциативности и коммутативности имеем (a+1)+(b-
1)=a+b. Если b=0, то сумма совпадает с a.
Поэтому получаем следующую функцию:
function plus(a,b:integer):integer;
begin if b=0
then plus := a
else if b>0
then plus := plus(succ(a),pred(b))
else plus := plus(pred(a),succ(b))
end;
Пример 13.9. Написать рекурсивную процедуру, которая считывает вводимые с
клавиатуры числа до тех пор, пока не будет обнаружен ноль. Затем введенные
числа распечатываются в обратном порядке.
Решение.
procedure wri;
var a:real;
begin read(a);
if a<>0 then wri;
write(a,' ')
end;
Упражнение. Измените процедуру примера 13.9 так, чтобы ноль не печатался.
Пример 13.10. Написать рекурсивную процедуру, переводящую целое число из
десятичной системы счисления в восьмиричную.
Решение.
procedure convert(z:integer);
begin if z>1 then convert(z div 8);
write(z mod 8:1)
end;
Упражнение. Исправьте процедуру примера 13.10 так, чтобы можно было
перевести число в шестнадцатиричную систему счисления.
Пример 13.11. Написать рекурсивную функцию для поиска максимального
элемента в одномерном массиве.
Решение. Предположим, что массив описан в следующем операторе описания
типа: type mas= array [1..n] of real;
function m(a:mas;i:integer):real;
begin if i=1
then m := a[1]
else if a[i]>m(a,i-1)
then m := a[i]
else m := m(a,i-1)
end;
Пример 13.12. Задан прямоугольник со сторонами А и В (А,B - натуральные
числа). Разбиваем его на части с помощью квадратов. Определить, сколько
квадратов получится, если каждый раз выбирается самый большой квадрат.
213 Решение. В силу законов ассоциативности и коммутативности имеем (a+1)+(b- 1)=a+b. Если b=0, то сумма совпадает с a. Поэтому получаем следующую функцию: function plus(a,b:integer):integer; begin if b=0 then plus := a else if b>0 then plus := plus(succ(a),pred(b)) else plus := plus(pred(a),succ(b)) end; Пример 13.9. Написать рекурсивную процедуру, которая считывает вводимые с клавиатуры числа до тех пор, пока не будет обнаружен ноль. Затем введенные числа распечатываются в обратном порядке. Решение. procedure wri; var a:real; begin read(a); if a<>0 then wri; write(a,' ') end; Упражнение. Измените процедуру примера 13.9 так, чтобы ноль не печатался. Пример 13.10. Написать рекурсивную процедуру, переводящую целое число из десятичной системы счисления в восьмиричную. Решение. procedure convert(z:integer); begin if z>1 then convert(z div 8); write(z mod 8:1) end; Упражнение. Исправьте процедуру примера 13.10 так, чтобы можно было перевести число в шестнадцатиричную систему счисления. Пример 13.11. Написать рекурсивную функцию для поиска максимального элемента в одномерном массиве. Решение. Предположим, что массив описан в следующем операторе описания типа: type mas= array [1..n] of real; function m(a:mas;i:integer):real; begin if i=1 then m := a[1] else if a[i]>m(a,i-1) then m := a[i] else m := m(a,i-1) end; Пример 13.12. Задан прямоугольник со сторонами А и В (А,B - натуральные числа). Разбиваем его на части с помощью квадратов. Определить, сколько квадратов получится, если каждый раз выбирается самый большой квадрат.
Страницы
- « первая
- ‹ предыдущая
- …
- 209
- 210
- 211
- 212
- 213
- …
- следующая ›
- последняя »