Конспект лекций по программированию для начинающих. Гладков В.П. - 211 стр.

UptoLike

Составители: 

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 - натуральные
числа). Разбиваем его на части с помощью квадратов. Определить, сколько
квадратов получится, если каждый раз выбирается самый большой квадрат.