WWW.REFERATCENTRAL.ORG.UA - Я ТУТ НАВЧАЮСЬ

... відкритий, безкоштовний архів рефератів, курсових, дипломних робіт

ГоловнаІнформатика, Компютерні науки → Обpобка масивiв - Реферат

Обpобка масивiв - Реферат


Реферат на тему:
Об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, де m0, n0. К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)
( 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
Loading...

 
 

Цікаве