Рекурсия в Паскале: примеры и решения
Рекурсия
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. |