Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;gnu clisp 2.49.60
- ;Условие: Дан список из n чисел и натуральное число m<n. Для каждой группы из m элементов, которые находятся рядом, вычислить ее сумму. Написать функцию, которая выдает список из всех возможных сумм.
- ;Пример: (7 1 4 2 3), m=3. S= (12 7 9).
- (defun tp() (terpri)) ;Упрощает перенос.
- (defun len (w &optional (n 0)) ;ДЛИНА: Вычисляет длину списка.
- (cond ((null w) n)
- (t (len (cdr w) (1+ n))))) ;обращается к
- (defun sumfirst(lst m) ;Суммирует m первых элементов списка lst.
- (cond
- ((< m 0) nil)
- ((= m 0) 0)
- (T (+ (car lst) (sumfirst (cdr lst) (- m 1)))) ;Суммирует первый элемент и сумму остального списка.
- )
- )
- (defun get-sums(lst m &optional (l (len lst))) ;ГЛАВНАЯ ФУНКЦИЯ: вычисляет все суммы списка lst длиной m, которые находятся рядом.
- (setq l (len lst))
- (cond
- ((< m 1) nil)
- ((< l m) nil)
- ((= l m) (cons (sumfirst lst m) nil)) ;преобразует объединение (a.nil) в a
- (T (cons (sumfirst lst m) (get-sums (cdr lst) m))) ;Функция создаёт массив значений функции sumfirst, полученный через рекурсию.
- )
- )
- ;Создание списков
- (setq a '(1 2 3 4 5)
- b '(6 7 8 9 10)
- c '(6 3 7)
- d '(47 24 -77)
- e '(3 5 44 63 46 6 6 5))
- (setq ab (append a b)
- bc (append b c)
- cd (append c d)
- de (append d e))
- ; ВЫВОД
- (format T "~a" (get-sums a 2))(tp)
- (format T "~a" (get-sums a 3))(tp)
- (format T "~a" (get-sums b 2))(tp)
- (format T "~a" (get-sums e 2))(tp)(tp)
- (format T "~a" (get-sums ab 4))(tp)
- (format T "~a" (get-sums bc 4))(tp)
- (format T "~a" (get-sums cd 4))(tp)
- (format T "~a" (get-sums de 4))(tp)
- (tp)
- (format T "~a" (get-sums cd 0))(tp)
- (format T "~a" (get-sums cd 1))(tp)
- (format T "~a" (get-sums cd 8))(tp)
- ;ИНДИВ 2
- ;Проверяет наличие элемента в списке.
- (defun ss (obj lst)
- (cond ((null lst) nil)
- ((equal obj (car lst)) T)
- (t (ss obj (cdr lst)))))
- ;Воссоздаёт список с уникальным множеством его элементов
- (defun uniquify (lst &optional (calc '()))
- (cond
- ((null lst) calc)
- ((ss (car lst) calc) (uniquify (cdr lst) calc))
- (T (uniquify (cdr lst) (cons (car lst) calc)))
- )
- )
- ;Сравнивает длины двух списков, не вычисляя их.
- (defun len-compare (lst-1 lst-2)
- (cond
- ((null lst-1) (cond((null lst-2) t)(t nil)))
- (t (cond((null lst-2) nil)(t (len-compare (cdr lst-1) (cdr lst-2)))))
- )
- )
- ;Сравнивает строки lst-1 и lst-2
- (defun eq-strings (lst-1 lst-2)
- (setq _1 (uniquify lst-1) _2 (uniquify lst-2) q (uniquify (append _1 _2)))
- (and (len-compare q _2) (len-compare q _1))
- )
- ;Выводит ответ на экран
- (defun ans (s) ;s - bool
- (format t "Списки состоят из ~a элементов" (cond ((null s) "РАЗНЫХ") (t "ОДИНАКОВЫХ")))
- (terpri)
- )
- ;Примеры ввода:
- (ans (eq-strings '(1 2 3 4 5 6 7) '(3 4 5 6 7 1 2)))
- (ans (eq-strings '(1 2 3 4 5 6 7) '(3 4 5 0 7 1 2)))
- (ans (eq-strings '(1 2 3 4) '(4 4 3 2 3 1 2)))
- (ans (eq-strings '(1 2 3 4) '(1 1 1 2 d 2 2 2 2 2 3)))
- (terpri)
- (ans (eq-strings '(() () () () ()) '(nil nil nil)))
- (ans (eq-strings '() '()))
- (terpri)
- (ans (eq-strings '(к а б а н) '(б а н к а)))
- (ans (eq-strings '(к а р а т и с т) '(а р т и с т к а)))
- (ans (eq-strings '(л и л и я) '(и л ь я)))
- (ans (eq-strings '(м а л а я р е к а к я ц и н) '(р е к л а м н а я а к ц и я)))
- ;4 вариант. f(x)=e^(-2x)∙cos(x/3)
- (defmacro f (x)
- (* (exp (* -2 x))
- (cos (/ x 3))
- ))
- (print (f 0)) ;f(0)=1
- (print (f -1)) ;f(-1)=6.98
- (print (f 1)) ;f(1)=0.128
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement