����i� 6
��p���� �����i�
� �i��i � ������� ������, ��� ���� ������� ������. ������ ����� ���������
�� ��������� �����i�. ��� ����� �����i��� �������� �����i� �������������
�����i�, ������� �� �������� ������, �� ��i�� �������� �������� ������.
���������� �� ����i�� �� �������i.
������. � ������� a:array [0..k] of integer �� b:array [0..l] of integer
����i������� ����i�i���� ���� ���������i� �������� k �� l. ��������� �����
c:array[0..m] of integer ����i�i������ �� �������. ����� k,l,m - ���������i,
m = k+l. ������� ������ � i������� i �i����� ����i�i��� ��� x � ������i i.
����'����. ����'���� �i�� �����i �� ������i �� ��������� ������:
for i := 0 to m do c[i] := 0;
for i := 0 to k do
for j := 0 to l do
c[i+j] := c[i+j] + a[i] * b[j];
������ ����i�i���i� ���������� ���������������� ������� �i����i��� �������.
����� lst1 �� lst2 - ������ ����i�i���i� ������� � ����i ���������i�. �����
�����i� (MULTPOL lst1 lst2) ������� ������ ����i�i���i� ������� ���i����
���������i�. ���������, ���i��i ���������� (x3+2x2+1) �� (x2-4x-1) ����������
�������� lst1 = (1 2 0 1), lst2 = (1 -4 -1). ����������� �� �������� ����
��������� x^5 - 2*x^4 - 9*x^3 - x^2 - 4*x -1, ���� ������������� �������
lst3 = (1 -2 -9 -1 -4 -1). �������� ��� �����i��� ������ �������� k �� l
(���� �� �� �������� �� �� ���������). ��� ����� �����i��� ������ ������
������� �����i� lst1 �� lst2. �� ������� �����i� (LENGTH lst):
(DEFUN LENGTH (lst) (DEFUN GEN0 (n)
((NULL lst) 0) ((ZEROP n) NIL)
(+ 1 (LENGTH (CDR lst))) ) (CONS 0 (GEN0 (- n 1))) )
������ ������� �����i� lst1 �� lst2 (k �� l �i����i���), �� ����� �������
������������� ������ lst3 (m=k+l). �����i��� ����������� ������ lst3, ����
���������� � m �������i�, ������ � ���� ���i���� 0. �� ������� �����i�
(GEN0 n).
�����i� (mas lst n) ������� n-�� ������� ������ lst. �����i�
(CHANGE lst n value) ������� ������ lst, � ����� n-�� ������� ����� ��������
value.
(DEFUN MAS (lst n) (DEFUN CHANGE (lst n value)
((ZEROP n) (CAR lst)) ((ZEROP n) (POP lst) (PUSH value lst))
(MAS (CDR lst) (- n 1)) ) (CONS (CAR lst) (CHANGE (CDR lst) (- n 1) value))
���i �����i� MULTPOL, ��� �������� �� ������i, �� �i��i ������ ����������
�������:
(DEFUN MULTPOL (lst1 lst2)
(SETQ k (LENGTH lst1) l (LENGTH lst2) lst3 (GEN0 (+ k l)))
(SETQ i 0)
(POP lst3)
(LOOP
((= i k) lst3)
(SETQ j 0)
(LOOP
((= j l))
(SETQ lst3 (CHANGE lst3 (+ i j) (+ (MAS lst3 (+ i j)) (* (MAS lst1 i) (MAS lst2 j)))) )
(INCQ j) )
(INCQ i) ) )
���������� muLisp �� ����� ���������� �����i� MAKE-LIST, ��� �����
��������������� ��� ��������� �����i� �������� ����i��. �����i�
(MAKE-LIST n ��'��� ������) ������� ������ � n �������i�, ������ � ����
������ �������� ��'����, �������i �� ������. ���� �� ������ ������
��������, �� �� ���������� n = 0. ���� ������ �������� �� ������, ��
��������� ��'��� = NIL.
$ (MAKE-LIST 3 '(q w)) $ (MAKE-LIST 4) $ (MAKE-LIST 3 5 '(2 3))
((q w)(q w)(q w)) (NIL NIL NIL NIL) (5 5 5 2 3)
�������� �����i� ����� ��������� ��������� ����� (i�'� ��i���� �� MAKE-LST):
(DEFUN MAKE-LST (N OBJ LST)
((AND (INTEGERP N) (PLUSP N))
(CONS OBJ (MAKE-LIST (SUB1 N) OBJ LST)) )
LST )
������ (OBLIST) �� �� �� ��������i�, ������� �� ������� ������ �������� ��
�������� ������ ������i� � ������i. ������� ����������i � ���� �������, �
����� ���� ��������i ��� ����������i ���������� �����i���: ���i ������i
����������i ��i�� �i� ������.
������ 1. ���� ��������� ������ ����� x. ������ �i���i��� �i���� �����
����� �������i� ����� ������. H������� �����i� (FIND_DIFF x)
����i���: ������ ����� �� 1 �i���� �� �i���i��� ��� ����� i �� 1..n-1, ���
���� x[i] <> x[i+1].
(DEFUN find_diff (x)
((NULL (CDR x)) 1)
(IF (/= (CAR x) (CADR x)) (+ 1 (find_diff (CDR x))) (find_diff (CDR x)))
)
������ 2. ���� ����� �i��� ����� x. ������ �i���i��� �i���� ����� �����
�������i� ����� ������. �i����, �� ��i �������� ������ - ����� �i� 1 �� n.
������ ��i��� O(n). H������� �����i� (FIND_NUM_N n x).
����i���: ����p��� �����i���� ����� lst ����� �i� 1 �� n �� �p� ������i
�������� i ��i������ �� ������� ������� ������ x[i].
(DEFUN find_num_n (n x)
(SETQ a (GEN0 n))
(LOOP
((NULL x))
(SETQ a (CHANGE a (CAR x) (+ 1 (MAS a (CAR x)))))
(SETQ x (CDR x))
) a )
������ 3. �i��� ���� p������� �� ���� ������� � ���� ������. �������
���� �i��� �� �i���� �� �. ������ �i���i��� �i���� ����i�, �� ����
�i��� ���� ������ ���� �i� ������� �� �i���.
�������.
�=3, �=2
������i �����:
1,1,1
1,2
2,1
�i����i��:3.
����i���: ��������� ����'���� �����i ��p������ ������� ����� N ��
��i���i ���� ����� �����, ��� ������ ������� � ���i ��� �� �i����� �� k.
��������, ��� ����� �������i� ���� ������, �������� ���� �p������ ��
�����, �� ������� ������i� � p������i � i��������, ���� �� �i� �i����i��
�i��i� ����i�������i �p��i� �i���.
��������� ����� S(i) �i���i��� �i���� ����i�, �� ���� �i��� ���� ������ ����
�i� ������� �� �����i� � ������� i. �p��������, �� ��� ���i������ j �i� 1 �� i
�i���i �������� ������� S(j). ������ ������ � ���������i ������� ����������
�������� S(i+1), ����p��������� �������� �i����� �������. ����� ���i����, ��
� �����i� � ������� i+1 �i��� ���� ���p����� i� �����i� i, i-1,...,i-k+1.
���� S(i+1)=S(i)+S(i-1)+...+S(i-k+1).
����� �����, ���������� ����i����� �������� �������
S(1), S(2), ..., S(N) �� �������� ���� ��������, ��p����� ��������
S(N), ��� i ������ �������� �i���i��� �i���� ����i�, ��
���� �i��� ���� ������ ���� �i� ������� �� �����i� � ������� N.
(DEFUN FISHKA (n k)
(F n k '(1))
)
(DEFUN F (n k lst)
(print lst)
((= (+ n 1) (LENGTH lst)) (CAR lst))
(SETQ l lst i 0 summa 0)
(LOOP
((OR (NULL l) (= i k)))
(INCQ summa (CAR l))
(POP l)
(INCQ i)
)
(F n k (CONS summa lst))
)
������ 4. � ���� � ��i�����. � ����i (m,n) ����������� �i���. ���� ����
p������� ���� � ���� ���p�����: ��i�� (��������� ���p������ m �� 1) ���
���� (��������� ���p������ n �� 1). H������� �����i� (GO m n), ��� ���������
�i���i��� pi���� ����i� � ��i����� (m,n) �� ��i����� (0,0).
����i���: �i���i��� ����i� � ����� (m,0) �� (0,n) �� ���� (0,0) ��pi���� 1,
�� m<>0, n<>0. �i���i��� ����i� � ���� (m,n) ��pi���� ���i �i������i ����i�
� ���� (m-1,n) �� ���� (m,n-1). ���� ��p�� f(m,n) ��������� ������ � �����i
�i���i��� ����i�, ��
f(m,n) = f(m-1,n) + f(m,n-1), n>0,m>0.
f(m,0) = f(0,n) = 1, m>0, n>0.
f(0,0) = 0.
�����i� ����i�
�����i� ����i� ���������i ��� ������ � ��������. ���� ������������ ���������
������ �i������i ������i� ��� ���������� ������� - ���i������, ������ ��
������������ P - i��� ������i� �� �����. P - i�'� ����� ��i������� �
�i����i�����i �� ������� ������� �������� (�������� ��i��� *PRINT-BASE*).
1. UNPACK atom. ������� ������ ������i�, P - i���� ������� � ����
����������� � ���������� ������i� ����� atom. ���� atom �� � ������, ��
����������� NIL.
(DEFUN UNPACK (ATM)
((SYMBOLP ATM) (������ ������i�, P - i���� ���� ����������� � ����������
������i� ����� ATM) )
((NUMBERP ATM) (������ ������i�, P - i���� ���� ����������� � ���� ����� ATM) ) )
$ (UNPACK 'abcde) $ (UNPACK 216) $ (SETQ *PRINT-BASE 16*)
(a b c d e) (\2 \1 \6) $ (UNPACK 216)
(\0 \D \8)
2. PACK list. ������� ������, P - i�'� ����� �����i����� �i ���������
P - i��� ����i� � ������ list. ��� ���������� P - i��� �����
��������������� ������� ������� ��������. �����i� PACK ������ �������
������, ���i�� ���� P - i�'� ���������� �i���� � ����������� �����.
(DEFUN PACK (LST)
((ATOM LST) "")
((SYMBOLP (CAR LST)) (������, P - i�'� ����� ���������� � P - i���i (CAR LST),
��������� � (PACK (CDR LST))) )
((NUMBERP (CAR LST)) (������, P - i�'� ����� ���������� � ���� � �����������
�����������i (CAR LST), ��������� � (PACK (CDR LST))) )
(PACK (CDR LST)) )
$ (PACK '(a b c d e) $ (PACK '(\7 \3 \1) $ (PACK '(Q \7 \A \1))
abcde |731| Q7A1
$ (PACK '(23 56) $ (PACK '("" 3 ||))
|2356| \3
3. PACK* atom1 ... atomN. ������� ������, P-i�'� ����� ���������� �i
��������� P-i��� ����i�. �� �����i� � ������� ����i�� PACK, ���i���� ����
������ �� �i ������� ����i�, � � ����-���� �i���i��� ����i�.
(DEFUN PACK* LST
(PACK LST) )
$ (PACK* 'a 'b 'c) $ (PACK 4 'QW 'T)
ABC |4QWT|
4. CHAR atom n. ���� atom - ������ ��� �����, � n - ���i�'���� �i��
�����, �����i� CHAR ������� ������, P - i�'� ����� � n-�� ������ P -
i���i atom, ������� �i��i� ������i� ���������� � 0. �����i� ������� NIL
���� n �� ���� i �� ������� �i�� �����, ��� ���� P - i�'� ����� atom
�i����� ����� �i� n ������i�.
(DEFUN CHAR (atm n)
((ATOM atm) (NTH n (UNPACK atm)) ) )
$ (CHAR 'ABCDE 3) $ (CHAR 12345 0) $ (CHAR 'qwe 8)
D \1 NIL
5. SUBSTRING atom n m. ���� atom - ������ ��� �����, n �� m -
���i�'���i �i�i, n<=m, �� �����i� SUBSTRING ������� ������, P - i�'� �����
���������� � ������i� P - i��� ����� ��������� � n-��� �� m-���, �������
�i��i� ������i� ���������� � 0. ���� n<=0, �� ��������� �� n=0. ���� m ��
�������, ��� ������ �� 0 �� �i���� �� �i���i��� ������i� � P - i���i �����,
m ��������� �i���� �i������i ������i� � P - i���i �����. ���� n>m
����������� NIL.
(DEFUN SUBSTRING (atm n m)
((AND (ATOM atm) (INTEGERP n))
((MINUSP n) (SUBSTRING atm 0 m))
(PACK (SUBLIST (UNPACK atm) n m))
$ (SUBSTRING 'ABCDEFG 2 4) $ (SUBSTRING 'ABCDEFG 3)
CDE DEFG
$ (SUBSTRING 123456 3) $ (SUBSTRING 'ABCDEFG 0 3)
|456| ABCD
6. STRINGpr atom1 atom2 flag, �� pr - ����-����
�������� <, >, <=, >=, =, /=. �i��������� �����������i��� ���i������
P - i��� ����i� ��i��� � ���������� pr. ���� ���� ���i���� NIL,
���i������ �i��������� � ����������� ���i����. ���� ���� �� ������, �i�
��������� �i���� T. �����i� STRING= ������� ��� T ��� NIL. I��i �����i�
���������� ��� NIL, ��� ����� �����i� ������� �������, ��������� � �����
P - i���� �� ��i��������.
$ (STRING= 'ABC 'ABC) $ (STRING 'ABC 'ABC NIL)
T T
$ (STRING= 'Abc 'AbC) $ (STRING= 'Abc 'AbC NIL)
T NIL
$ (STRING= |100| 100) $ (STRING< 'ABC 'AZC)
T 1
$ (STRING< 'AZC 'ABC) $ (STRING>= '123 '123)
NIL 3
7. STRING-UPCASE atom. ������� ������, P - i�'� ����� ��i����� �
P - i����� �����, ��� ��i ���� �i���� �������������� � �����i. ���� atom
�� � ������, ����������� NIL.
$ (STRING-UPCASE "Lisp Is A Language") $ (STRING-UPCASE '(a s d))
|LISP IS A LANGUAGE| NIL
8. STRING-DOWNCASE atom. ������� ������, P - i�'� ����� ��i����� �
P - i����� �����, ��� ��i ���� �i���� �������������� � �������i.
���� atom �� � ������, ����������� NIL.
$ (string-upcase |This is A TEXT|) $ (string-downcase |This is A TEXT|)
|THIS IS A TEXT| |this is a text|
$ (STRING-UPCASE 'i) $ (STRING-DOWNCASE 'I)
I \i
9. FINDSTRING atom1 atom2 n. ������� ����� �����i� ������� ���������
P - i���i �����1 � P - i�'� �����2. ���� n - ���� ��� ������� �i��, �����
���������� � n-��� ������� �����2. ���� P - i�'� �����1 �� ��������,
����������� NIL.
(DEFUN FINDSTRING (ATM1 ATM2 N)
((OR (NOT (ATOM ATM1)) (NOT (ATOM ATM2))) NIL)
((PLUSP N)
((NULL (FINDSTRING ATM1 (SUBLIST ATM2))) NIL)
(+ N (FINDSTRING ATM1 (SUBLIST ATM2 N))) )
((���� ATM1 � �i������� ATM2)
(�����i� ATM1, �� ��i� ���� ������ �����i������ � ATM2) ) )
$ (FINDSTRING 'BC 'ABCDEFG) (FINDSTRING 'abc 'abdeabcde)
1 4
10. PRINT-LENGTH atom. ������� �i���i��� ������i� � P - i���i ����� �
����������� ������� ����������� ��i���� *PRINT-BASE* �� *PRINT-ESCAPE*.
$ (DEFUN PRINT-LENGTH (atm)
((ATOM atm) (LENGTH (UNPACK atm)))
$ (PRINT-LENGTH 'Mulisp)
6
$ (PRINT-LENGTH -156) $ (PRINT-LENGTH NIL)
4 3
���������� �����i�, ��� ��� �������� ����� ��������� ����������� �i���i���
�i���, ��� � ����� ��� �i����. ��������� ����, ���� ���������� � �i���� ��
�����. ���������, ��� ����� a22eeerty ��������� (e . 3).
(DEFUN symmax (atm) $ (symmax 'a22eeerty)
((NOT (ATOM atm)) NIL) (e . 3)
(SETQ lst (UNPACK atm) endel (ASCII 0) endct 0) $ (symmax 'nil)
(LOOP (n . 1)
((NULL lst)) $ (symmax 1222334)
(SETQ el (CAR lst) ct 0) (\2 . 3 )
(LOOP
((NOT (EQL (CAR lst) el)))
(POP lst)
(INCQ ct) )
(IF (> ct endct) (SETQ endct ct endel el)) )
(CONS endel endct) )
��������
1. �������� �����i�:
�) (GORNER n lst x) - ���������� �������� ���������� ������� n � ����i x,
����i�i���� ����� �����i � ������ lst.
�) (APPL lst1 lst2) - ������ ���� �i����������� �����i� � �i����������� ������.
�) (SCALAR lst1 lst2) - ��������� ������� ���� ������i�, ���������� ���� �����i
��������.
2. ���� ������ � n ����� �� ���������� ����� m < n. ��� ����� ����� � m
�������i�, �� ����������� �����, ��������� �� ����. ������ ������ � ��i�
�������� ���. �������� �i���i��� �i� ������� ���� O(n).
�������: (7 1 4 2 3), m=3. S= (12 7 9).
3. ������ LST ����i�� ������������ ����� 1,2,..,n. ��������� �i���i���
������������.
4. ������ LST ����i�� ������������ ����� 1,2,..,n. ��������� �i���i��� ����i�
� �����������i. ���������, 152463 = (1)(5632)(4) - ��� �����.
5. ����������� �������� ��i� ����������� ����� �i� 0 �� n. ����'����� �����
�� ������ �������������� �i���� ��������� �� �i��i�����, ��� ����� �i���i���
�i� ������� ���� O(n).
6. ��������� �����i�:
�) (MATR_GET m i j) - ��������� �������� m[i][j], �� m - ������� n * n, i<=n, j<=n.
�) (MATR_CHANGE m i j value) - ��������� �������, � ��i� m[i][j]=value.
�) (GENMATR0 i j) - ����������� ������� ������� i * j.
�) (PMATR m i j) - ����������� ������� m �� ������� i * j (���i� �����������).
������ 1. (1 ���). H������� �����i� �������� ��p������� (QUICK_SORT lst).
������ ��i��� - O(n*logn).
����i���: ����p������� ���������� �����i� (SPLIT <������>), ��� p������
������ �� ��� ������ ���������i. ��������� ������ ��� ���� ����� ��������.
�����i� SPLIT ������� ����� �������� ������.
$ (SETQ a '(1 2 3 4 5 6)) $ a
$ (SPLIT a) (1 2 3)
(4 5 6)
������ 2. (1 ���). H������ ������, ��� p���, ����� N �����, ���� � ����
������� �������, � i��i �����������i �� ������������ ���i���� �������
�i� 2 �� N. �i���� ������ p��� �� �, ��������� � �����. ���,
�� ���� ���������� �i���, �������� � ����. �i��� ������������ �
�������� ������ (��� ����� �����i � ���� �� p�������� i ��� �� ��� �i�,
���� �� ���������� ���� ������. ��������� ���������� ����� �i�� ������.
H������� �i����i��� �����i� (COUNT_MAN m n).
����i���: ���p������ ������ (1 2 3 ... n) �� ������� �i������� i=1,2,... .
���� i mod m = 0 �� ������� ������ ������, i����� �p������ ������ �� �i���
������.
������ 3. (1 ���). H� ��i���� ���i� ���i������� ����� N! = 1*2*...*N.
H������� �����i� (FACT0 N). ���������� p����� �����i� ���� �p������� ��
������ ��p���� N = 10^6. �������� �����pi��� ����� N p������� �� �p���.
��������� �������p����� �����i�, ��� p��� �i���i��� ���i�.
����i���: �i���i��� �����, ����� ���i������� ����� N! ��pi���� �i������i
����� 5 � p������i ����� N! �� �p���i ��������.(���p� 0 �� �i��i ����
�'�������� ���� ��p����������� 2 �� 5, � ���i���� �������i� 2 �i���� �� 5,
�� ��� p���'���� �����i ��������� �i�p������� �i���i��� 5).
H��p�����: 30! = 30* ...* 25 *...* 20 * ... * 15 * ... * 10 * ... * 5.
������ 7 �'��ip�� (25 �� ��i �'��ip��, ��i i��i �������i ����� - �� ���i�).
���� 30! ���i������� 7 ������.
������ 4. (�������� ������, 1 ���). ���� ����i����i��� �i��� �����
x[1],..., x[n]. ������ ����������� ������� �� �p������� �i�����i�������i.
H������� �����i� (MAX_SEQUENCE lst). ������ ��i��� O(n*log(n)).
������ 5. (�������� ������, 2 ����). � ��� �������� ���p� 1. H� ��p����
�p��i p����� ��� ��p����p�� �� �� ��p� ���p 0 1. H� ������� ����������
�p��i ���� ���i��� ������� 0 ������ ��p� 1 0, � ���i��� 1 - ��p� 0 1.
����� ����� �� �p����� �p��i �i����� 1 0 0 1, �� �p������ - 0 1 1 0 1 0 0 1
i ��� ���i. ��i���� ����i��������� � ���i� (����i����i��� � ���i� ������������
��� i �i���� ����, ��i ������ ��p��) ���� �������� �� n-��� �p��i?
H������� �����i� (EOM n). ������ ��i��� ����p���� - O(log N).
����i���: �� ��p�������� ������ � 0 �� 1 (���i���� ����� N ���� ���� ����
�������), � ������ �����i� ��� ����� �������� �p���� �� ���p��p������� ��.
��� ��������� ������� N ����� ��p����� ������ ��� ��p��ip�� �p���������i
p����� �������� �����i�.
����'����: �p� ���i �i���� �� ������ ������ ��p��, ���i���� ���i ��� � ���
������i ����p����� � ���i�� ����p����� ���p�, �� ����p����� �p������
��p����p����. ���� �� n-��� �p��i ������ �i�p��������� �i���i��� �����, ��
������ ��p��. �p� ��p����p���i ����� ��i 0 ��i 1 �� ����� ��p� 00. ����
����i���i� 00 ��p���� ���� ����i���i� 01 (����� � i���� ����i���i� 00, 10, 11
�� �i�������). ����, �i���i��� ��p ����� (EOM n) �� n-��� �p��i ��pi����
�i������i ��p 01 �� n-1 �p��i. n-�� �p�� �i����� 2^n ���p, ��p�� ����
2^(n-1) ����� (���� �� �� �p������� ��p����p���� �i���i��� ����� �� �������
� ����i�������i ���������� ���������). �i��� ������� ���� �� n-��� �p��i
����� 0 � (EOM n) ��������, � ������� ����� � 2^(n-1) - (EOM n)
��������. ����� �� n-��� �p��i 2^(n-1) - (EOM n) ����i���i� 01. �� i �i����
�� ������� ����i���i� 01 ����� �� (n+1) - ��� �p��i ���� � �i���i��� 00.
����� EOM (+ n 1)) = 2^(n-1) - (EOM n). �p� ����� (EOM 1) = 0.
����'������ �� pi������, ����: (EOM n) = (2^(n-1)+(-1)^n)/3.
���i���� ���p��i� �i�������� �� ������� a^N ����� �������� �� ��� O(logN),
�� i ������ ��i��� ���������� ����p���� ��pi���� O(logN).