Засоби та принципи програмування на Ліспі, Детальна інформація

Засоби та принципи програмування на Ліспі
Тип документу: Реферат
Сторінок: 7
Предмет: Комп`ютерні науки
Автор: Олексій
Розмір: 12.9
Скачувань: 1182
12. EXECUTE <програма> <командний рядок> Зупиняється робота системи muLisp, передається керування програмі з командним рядком. EXECUTE повертає код виходу з програми або NIL, якщо <програма> не знайдена.

$ (EXECUTE “command.com” “/c dir c:”)

2. Обчислення рекурсивних функцій

1. Факторіалом числа n називається число (позначається n!), яке рекурсивно визначається наступним чином:

0! = 1

N! = N*(N-1)! якщо N>0.

$ (DEFUN FACTORIAL (n) $ (FACTORIAL 10)

((ZEROP n) 1) 3628800

(* n (FACTORIAL (- n 1))) )

Якщо в рекурсивній програмі аргументом буде велике число, то може виникнути переповнення стеку. Використовуючи команду циклу LOOP можна уникнути рекурсивного виклику. Наступна функція буде більш ефективною:

$ (DEFUN FACTORIAL1 (n rslt) $ (FACTORIAL1 10)

(SETQ rslt 1) 3628800

(LOOP

((ZEROP n) rslt ) $ (FACTORIAL 0 a)

(SETQ rslt (* n rslt)) 1

(SETQ n (- n 1)) ) )

2. Послідовність чисел, кожен елемент якої дорівнює сумі двох попередніх, а перші два елементи дорівнюють 1, називається послідовністю Фібоначчі. N-те число послідовності Фібоначчі F(N) може бути знайдене за рекурсивною формулою:

F(0)=1, F(1)=1, F(N) = F(N-1) + F(N-2).

$ (DEFUN FIBON (n) $ (FIBON 20)

((<= n 1) 1) 10946

(+ (FIBON (- n 1)) (FIBON (- n 2))) )

Визначена таким чином функція не є ефективною, оскільки для обчислення N-ого числа Фібоначчі необхідно обчислити (N-2) число Фібоначчі двічі, (N-3) — тричі і так далі. Визначимо функцію FIB з трьома аргументами, останні два з яких при виклику функції повинні дорівнювати відповідно F(0) та 0).

$ (DEFUN FIB (n f1 f2) $ (FIB 20 1 0)

((ZEROP n) f1) 10946

(FIB (- n 1) (+ f1 f2) f1) )

3. Обробка масивів

В Ліспі є поняття списку, але немає поняття масиву. Масиви можна емулювати за допомогою списків. Для цього необхідно написати функції конструювання масивів, доступу до елемента масива, та зміни значення елемента масива. Розглянемо цю техніку на прикладі.

Задача. В масивах a:array [0..k] of integer та b:array [0..l] of integer зберігаються коефіцієнти двох многочленів степеней k та l. Заповнити масив c:array[0..m] of integer коефіцієнтами їх добутку. Числа k,l,m — натуральні, m=k+l. Елемент масива з індексом i містить коефіцієнт при x в степені i.

Розв’язок. Розв’язок цієї задачі на Паскалі має наступний вигляд:

for i := 0 to m do c[i] := 0;

The online video editor trusted by teams to make professional video in minutes