Pascal: Проверь себя (рекурсия в Паскале: примеры и решения)

Рекурсия в Паскале: примеры и решения

Содержание:

Рекурсия

Pascal рекурсия 1: Описать рекурсивную функцию MaxInt(A, N) целого типа, которая находит максимальный элемент целочисленного массива A размера N (1≤N≤10), не используя оператор цикла. С помощью этой функции найти максимальные элементы массивов A, B, C размера NA, NB, NC соответственно.

* Из задачника М. Э. Абрамян (Recur11)

Проверить:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
type
 ar = array[1..10]of integer;
 
var
 NA,NB,NC:integer;
 A,B,C:ar;
 
Function MaxInt(A:ar;N:integer):integer;
begin
 if N<2 then MaxInt:=A[N]
 else
  if A[N]>MaxInt(A,N-1) then MaxInt:=A[N]
  else MaxInt:=MaxInt(A,N-1);
end;
 
Procedure InputArray(var A:ar;N:integer);
var i:integer;
begin
 for i:=1 to N do
  begin
   Write(i,': ');
   Readln(A[i]);
  end;
end;
 
begin
 Write('NA: ');
 Readln(NA);
 InputArray(A,NA);
 Writeln(MaxInt(A,NA));
 
 Write('NB: ');
 Readln(NB);
 InputArray(B,NB);
 Writeln(MaxInt(B,NB));
 
 Write('NC: ');
 Readln(NC);
 InputArray(C,NC);
 Writeln(MaxInt(C,NC));
end.
Pascal рекурсия 2: Описать рекурсивную функцию P_Alindrom(S) логического типа, возвращающую True, если строка S является палиндромом (то есть читается одинаково слева направо и справа налево), и False в противном случае. Оператор цикла в теле функции не использовать. Вывести значения функции P_Alindrom для пяти данных строк.

* Из задачника М. Э. Абрамян (Recur13)

Проверить:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var
 S:String;
 i:integer;
 
Function  P_Alindrom(S:String):boolean;
begin
 if length(S)<=1 then  P_Alindrom:=True
 else if S[1] = S[length(S)] then
       begin
        Delete(S,1,1);
        Delete(S,length(S),1);
        P_Alindrom:=P_Alindrom(S) and True;
       end
      else P_Alindrom:=False;
end;
 
begin
 for i:=1 to 5 do
  begin
   Write('S: ');
   Readln(S);
   Writeln(P_Alindrom(S));
  end;
end.
Pascal рекурсия 3: Дано дерево глубины N, каждая внутренняя вершина которого имеет K<10 непосредственных потомков (нумеруются от 1 до K). Корень дерева имеет номер 0. Записать в текстовый файл с данным именем все возможные пути, ведущие от корня к листьям. Перебирать пути, начиная с «самого левого» и заканчивая «самым правым» (при этом первыми заменять конечные элементы пути).

* Из задачника М. Э. Абрамян (Recur25)

Проверить:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
var
  F:Text;
  K,N:Integer;
  FN:String;
 
procedure node(Ancestors:String; lvl:integer);
var
 F:Text;
 i:integer;
begin
 inc(lvl);
 if lvl=N+1 then
  begin
   Assign(F,FN);
   Append(F);
   Writeln(F,Ancestors);
   Close(F);
  end
 else
  for i:=1 to K do node(Ancestors+chr(i+48),lvl);
end;
 
begin
 Write('N:');
 readln(N);
 Write('K:');
 readln(K);
 Write('FileName:');
 readln(FN);
 Assign(F,FN);
 Rewrite(F);
 Close(F);
 node('0',0);
end.

Записи

Pascal записи 1: Описать тип TDate - запись с полями целого типа Day (день), Month (месяц) и Year (год) - и функцию LeaP_Year(D) логического типа с параметром типа TDate, которая возвращает True, если год в дате D является високосным, и False в противном случае. Вывести значение функции LeaP_Year для пяти данных дат (предполагается, что все даты являются правильными). Високосным считается год, делящийся на 4, за исключением тех годов, которые делятся на 100 и не делятся на 400.

* Из задачника М. Э. Абрамян (Param59)

Проверить:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
type
 TDate = record
   Day:integer;
   Month:integer;
   Year:integer;
 end;
var
 D:TDate;
 
Function LeaP_Year(D:TDate):boolean;
begin
 if (D.Year mod 100)=0 then
  if (D.Year mod 400)=0 then LeaP_Year:=True
  else LeaP_Year:=False
 else
  if (D.Year mod 4)=0 then LeaP_Year:=True
  else LeaP_Year:=False;
end;
 
begin
 Write('Date: ');
 Readln(D.Day,D.Month,D.Year);
 Writeln(LeaP_Year(D));
end.
Pascal записи 2: Описать тип TPoint - запись с полями вещественного типа X и Y (координаты точки на плоскости) - и функцию Leng(A, B) вещественного типа, находящую длину отрезка AB на плоскости по координатам его концов:
записи в Паскале
(A и B - параметры типа TPoint). С помощью этой функции найти длины отрезков AB, AC, AD, если даны координаты точек A, B, C, D.

* Из задачника М. Э. Абрамян (Param64)

Проверить:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
type
 TPoint = record
   x,y:real;
 end;
var
 A,B,C,D:TPoint;
 
Function Leng(A,B:TPoint):real;
begin
 Leng:=sqrt(sqr(A.X-B.X)+sqr(A.Y-B.Y));
end;
 
begin
 Write('A(x,y): ');
 Readln(A.x,A.y);
 Write('B(x,y): ');
 Readln(B.x,B.y);
 Write('C(x,y): ');
 Readln(C.x,C.y);
 Write('D(x,y): ');
 Readln(D.x,D.y);
 
 Writeln(Leng(A,B));
 Writeln(Leng(A,C));
 Writeln(Leng(A,D));
end.