ВУЗ:
Составители:
Рубрика:
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
- …
- следующая ›
- последняя »
