Засоби та принципи програмування на Ліспі, Детальна інформація
Засоби та принципи програмування на Ліспі
for i := 0 to k do
for j := 0 to l do
c[i+j] := c[i+j] + a[i] * b[j];
Масиви коефіцієнтів многочлена представлятимемо списком відповідної довжини. Нехай lst1 та lst2 — списки коефіцієнтів заданих в умові многочленів. Нехай функція (MULTPOL lst1 lst2) повертає список коефіцієнтів добутку вихідних многочленів. Наприклад, вихідні многочлени (x3+2x2+1) та (x2-4x-1) зададуться списками lst1 = (1 2 0 1), lst2 = (1 -4 -1). Результатом їх множення буде многочлен x5 - 2x4 - 9x3 - x2 - 4x -1, який представиться списком lst3 = (1 -2 -9 -1 -4 -1). Спочатку нам необхідно знайти значення k та l (якщо ми не передаємо їх як аргументи). Для цього необхідно просто знайти довжину списків lst1 та lst2. Це зробить функція (LENGTH lst):
(DEFUN LENGTH (lst) (DEFUN GEN0 (n)
((NULL lst) 0) ((ZEROP n) NIL)
(+ 1 (LENGTH (CDR lst))) ) (CONS 0 (GEN0 (- n 1))) )
Знаючи довжини списків lst1 та lst2 (k та l відповідно), ми знаємо довжину результуючого списку lst3 (m=k+l). Необхідно згенерувати список lst3, який складається з m елементів, кожний з яких дорівнює 0. Це зробить функція (GEN0 n).
Функція (mas lst n) повертає n-ий елемент списку lst. Функція (CHANGE lst n value) повертає список lst, в якому n-ий елемент набув значення value.
(DEFUN MAS (lst n)
((ZEROP n) (CAR lst))
(MAS (CDR lst) (- n 1)) )
(DEFUN CHANGE (lst n value)
((ZEROP n) (POP lst) (PUSH value lst))
(CONS (CAR lst) (CHANGE (CDR lst) (- n 1) value)) )
Тоді функція MULTPOL, яка написана на Паскалі, на Ліспі набуває наступного вигляду:
(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) ) )
3/4
U
for j := 0 to l do
c[i+j] := c[i+j] + a[i] * b[j];
Масиви коефіцієнтів многочлена представлятимемо списком відповідної довжини. Нехай lst1 та lst2 — списки коефіцієнтів заданих в умові многочленів. Нехай функція (MULTPOL lst1 lst2) повертає список коефіцієнтів добутку вихідних многочленів. Наприклад, вихідні многочлени (x3+2x2+1) та (x2-4x-1) зададуться списками lst1 = (1 2 0 1), lst2 = (1 -4 -1). Результатом їх множення буде многочлен x5 - 2x4 - 9x3 - x2 - 4x -1, який представиться списком lst3 = (1 -2 -9 -1 -4 -1). Спочатку нам необхідно знайти значення k та l (якщо ми не передаємо їх як аргументи). Для цього необхідно просто знайти довжину списків lst1 та lst2. Це зробить функція (LENGTH lst):
(DEFUN LENGTH (lst) (DEFUN GEN0 (n)
((NULL lst) 0) ((ZEROP n) NIL)
(+ 1 (LENGTH (CDR lst))) ) (CONS 0 (GEN0 (- n 1))) )
Знаючи довжини списків lst1 та lst2 (k та l відповідно), ми знаємо довжину результуючого списку lst3 (m=k+l). Необхідно згенерувати список lst3, який складається з m елементів, кожний з яких дорівнює 0. Це зробить функція (GEN0 n).
Функція (mas lst n) повертає n-ий елемент списку lst. Функція (CHANGE lst n value) повертає список lst, в якому n-ий елемент набув значення value.
(DEFUN MAS (lst n)
((ZEROP n) (CAR lst))
(MAS (CDR lst) (- n 1)) )
(DEFUN CHANGE (lst n value)
((ZEROP n) (POP lst) (PUSH value lst))
(CONS (CAR lst) (CHANGE (CDR lst) (- n 1) value)) )
Тоді функція MULTPOL, яка написана на Паскалі, на Ліспі набуває наступного вигляду:
(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) ) )
3/4
U
The online video editor trusted by teams to make professional video in
minutes
© Referats, Inc · All rights reserved 2021