fork download
  1. (format t "Task 1")
  2. (terpri)
  3. ;Task 1
  4. ;min-ітеративна функція
  5. (defun FIND_MIN (lst)
  6. (setq curr-min (car lst))
  7. (loop for x in (cdr lst) do
  8. (if (< x curr-min)
  9. (setq curr-min x)))
  10. curr-min)
  11.  
  12. ;max-рекурсивна функція
  13. (defun FUNC_FIND_MAX (lst max-elem)
  14. (setq head (car lst))
  15. (cond
  16. ((identity lst) (cond
  17. ((> head max-elem) (FUNC_FIND_MAX (cdr lst) head))
  18. (t (FUNC_FIND_MAX (cdr lst) max-elem))))
  19. (t max-elem)))
  20.  
  21. (defun FIND_MAX (lst)
  22. (FUNC_FIND_MAX (cdr lst) (car lst)))
  23.  
  24. ; incr ітеративна функція
  25. ; істина, якщо lst в порядку зростання, в іншому разі nil
  26. (defun INCR (lst)
  27. (setq prev (car lst))
  28. (setq is-incr t)
  29. (loop for x in (cdr lst) do
  30. (if (< x prev)
  31. (return (setq is-incr nil))))
  32. is-incr)
  33.  
  34. ; decr рекурсивна функція
  35. ; істина, якщо lst в порядку спадання, в іншому разі nil
  36. (defun FUNC_DECR (prev lst)
  37. (cond
  38. ((not lst)
  39. t)
  40. ((> (car lst) prev)
  41. nil)
  42. (t (FUNC_DECR (car lst) (cdr lst)))))
  43.  
  44. ; викликає FUNC_DECR з lst head і tail
  45. (defun DECR (lst)
  46. (FUNC_DECR (car lst) (cdr lst)))
  47.  
  48. (format t "(FIND_MIN '(10 2 4 6 1 5)) = ~a~%" (FIND_MIN '(10 2 4 6 1 5)))
  49. (format t "(FIND_MAX '(10 2 4 6 1 5)) = ~a~%" (FIND_MAX '(10 2 4 6 1 5)))
  50. (terpri)
  51. (format t "(INCR '(-1 0 1 2 3 4)) = ~a~%" (INCR '(-1 0 1 2 3 4 )))
  52. (format t "(INCR '(4 3 2 1 0 -1)) = ~a~%" (INCR '(4 3 2 1 0 -1)))
  53. (terpri)
  54. (format t "(DECR '(5 4 3 2 1)) = ~a~%" (DECR '(4 3 2 1 0 -1)))
  55. (format t "(DECR '(1 2 3 4 5)) = ~a~%" (DECR '(-1 0 1 2 3 4)))
  56. (terpri)
  57.  
  58. (format t "Task 3а)")
  59. (terpri)
  60. ;Task 3a) рекурсивна функція
  61. ; ділить додатній x на додатній y, а коли викликається chc повинно бути 0
  62. ; повертає cons quotient remainder
  63. (defun FUNC_DIVIS (x y q)
  64. (cond
  65. ((< x y) (cons q x))
  66. (t (FUNC_DIVIS (- x y) y (+ 1 q)))))
  67.  
  68. ;; використовує FUNC_DIVIS і виправляє результати для недодатніх x та y
  69. ;; повертає cons quotient remainder
  70. (defun RECURSIVE_DIVIS (x y)
  71. (setq abs-x (abs x))
  72. (setq abs-y (abs y))
  73. (setq result (FUNC_DIVIS abs-x abs-y 0))
  74. (cond
  75. ((and (minusp x) (minusp y))
  76. (setq result (cons (+ 1 (car result)) (- (- (cdr result) abs-y)))))
  77. ((minusp x)
  78. (setq result (cons (- (+ 1 (car result))) (- (- (cdr result) abs-y)))))
  79. ((minusp y)
  80. (setq result (cons (- (car result)) (cdr result)))))
  81. result)
  82.  
  83. (format t "(RECURSIVE_DIVIS 5 2) = ~a~%" (RECURSIVE_DIVIS 5 2))
  84. (format t "(RECURSIVE_DIVIS -5 2) = ~a~%" (RECURSIVE_DIVIS -5 2))
  85. (format t "(RECURSIVE_DIVIS 5 -2) = ~a~%" (RECURSIVE_DIVIS 5 -2))
  86. (format t "(RECURSIVE_DIVIS -5 -2) = ~a~%" (RECURSIVE_DIVIS -5 -2))
  87. (terpri)
  88.  
  89.  
  90. ; 3a) ітеративна функція
  91. ; ділить x на y
  92. ; повертає cons quotient remainder
  93. (defun ITERATIVE_DIVIS (x y)
  94. (setq q 0)
  95. (setq abs-x (abs x))
  96. (setq abs-y (abs y))
  97. (loop while (>= abs-x abs-y) do
  98. (setq abs-x (- abs-x abs-y))
  99. (incf q))
  100. (cond
  101. ((and (minusp x) (minusp y))
  102. (setq result (cons (+ 1 q) (- (- abs-x abs-y)))))
  103. ((minusp x)
  104. (setq result (cons (- (+ 1 q)) (- (- abs-x abs-y)))))
  105. ((minusp y)
  106. (setq result (cons (- q) abs-x)))
  107. (t
  108. (setq result (cons q abs-x))))
  109. result)
  110.  
  111. (format t "(ITERATIVE_DIVIS 5 2) = ~a~%" (ITERATIVE_DIVIS 5 2))
  112. (format t "(ITERATIVE_DIVIS -5 2) = ~a~%" (ITERATIVE_DIVIS -5 2))
  113. (format t "(ITERATIVE_DIVIS 5 -2) = ~a~%" (ITERATIVE_DIVIS 5 -2))
  114. (format t "(ITERATIVE_DIVIS -5 -2) = ~a~%" (ITERATIVE_DIVIS -5 -2))
  115. (terpri)
  116.  
  117. (format t "Task 4a)")
  118. (terpri)
  119. ; Task 4a) рекурсивна функція
  120. ; шукає кількість знаків у двійковому представленні числа n.
  121. (defun FUNC_BINARY (n)
  122. (cond
  123. ((zerop n) 0)
  124. (t (+ 1 (FUNC_BINARY (ash n -1))))))
  125.  
  126. ; викликає FUNC_BINARY і обробляє особливий випадок коли n рівне 0
  127. (defun RECURSIVE_BINARY (n)
  128. (cond
  129. ((zerop n) 1)
  130. (t (FUNC_BINARY n))))
  131.  
  132. (format t "(RECURSIVE_BINARY 1) = ~a~%" (RECURSIVE_BINARY 1))
  133. (format t "(RECURSIVE_BINARY 2) = ~a~%" (RECURSIVE_BINARY 2))
  134. (format t "(RECURSIVE_BINARY 4) = ~a~%" (RECURSIVE_BINARY 4))
  135. (format t "(RECURSIVE_BINARY 10) = ~a~%" (RECURSIVE_BINARY 10))
  136. (terpri)
  137.  
  138. ; 4a) ітераційна функція
  139. ; шукає кількість знаків у двійковому представленні числа n.
  140. (defun ITERATIVE_BINARY (n)
  141. (setq len 0)
  142. (if (zerop n)
  143. (setq len 1)
  144. (loop while (not (zerop n)) do
  145. (setq n (ash n -1))
  146. (setq len (+ 1 len))))
  147. len)
  148.  
  149. (format t "(ITERATIVE_BINARY 1) = ~a~%" (ITERATIVE_BINARY 1))
  150. (format t "(ITERATIVE_BINARY 2) = ~a~%" (ITERATIVE_BINARY 2))
  151. (format t "(ITERATIVE_BINARY 4) = ~a~%" (ITERATIVE_BINARY 4))
  152. (format t "(ITERATIVE_BINARY 0) = ~a~%" (ITERATIVE_BINARY 10))
  153. (terpri)
  154.  
  155. (format t "Task 5в)")
  156. (terpri)
  157. ; 5в) рекурсивна функція
  158. (defun FUNC_SCALAR (lst1 lst2 res)
  159. (cond
  160. ((and lst1 lst2)
  161. (setq product (* (car lst1) (car lst2)))
  162. (FUNC_SCALAR (cdr lst1) (cdr lst2) (+ res product)))
  163. ((or lst1 lst2)
  164. nil)
  165. (t
  166. res)))
  167.  
  168. (defun RECURSIVE_SCALAR (lst1 lst2)
  169. (FUNC_SCALAR lst1 lst2 0))
  170.  
  171. (format t "(RECURSIVE_SCALAR '(1 2 3) '(3 2 1)) = ~a~%" (RECURSIVE_SCALAR '(0 2 5) '(1 2 1)))
  172. (format t "(RECURSIVE_SCALAR '(1 2 3) '(3 2)) = ~a~%" (RECURSIVE_SCALAR '(1 1 1) '(2 2)))
  173. (terpri)
  174.  
  175. ;; 5в) ітераційна функція
  176. (defun ITERATIVE_SCALAR (lst1 lst2)
  177. (setq res 0)
  178. (loop while (and lst1 lst2) do
  179. (setq product (* (car lst1) (car lst2)))
  180. (setq res (+ res product))
  181. (setq lst1 (cdr lst1) lst2 (cdr lst2)))
  182. (if (or lst1 lst2)
  183. nil
  184. res))
  185.  
  186. (format t "(ITERATIVE_SCALAR '(1 2 3) '(3 2 1)) = ~a~%" (ITERATIVE_SCALAR '(0 2 5) '(1 2 1)))
  187. (format t "(ITERATIVE_SCALAR '(1 2 3) '(3 2)) = ~a~%" (ITERATIVE_SCALAR '(1 1 1) '(2 2)))
  188. (terpri); your code goes here
Success #stdin #stdout 0.01s 9820KB
stdin
Standard input is empty
stdout
Task 1
(FIND_MIN '(10 2 4 6 1 5)) = 1
(FIND_MAX '(10 2 4 6 1 5)) = 10

(INCR '(-1 0 1 2 3 4)) = T
(INCR '(4 3 2 1 0 -1)) = NIL

(DECR '(5 4 3 2 1)) = T
(DECR '(1 2 3 4 5)) = NIL

Task 3а)
(RECURSIVE_DIVIS 5 2) = (2 . 1)
(RECURSIVE_DIVIS -5 2) = (-3 . 1)
(RECURSIVE_DIVIS 5 -2) = (-2 . 1)
(RECURSIVE_DIVIS -5 -2) = (3 . 1)

(ITERATIVE_DIVIS 5 2) = (2 . 1)
(ITERATIVE_DIVIS -5 2) = (-3 . 1)
(ITERATIVE_DIVIS 5 -2) = (-2 . 1)
(ITERATIVE_DIVIS -5 -2) = (3 . 1)

Task 4a)
(RECURSIVE_BINARY 1) = 1
(RECURSIVE_BINARY 2) = 2
(RECURSIVE_BINARY 4) = 3
(RECURSIVE_BINARY 10) = 4

(ITERATIVE_BINARY 1) = 1
(ITERATIVE_BINARY 2) = 2
(ITERATIVE_BINARY 4) = 3
(ITERATIVE_BINARY 0) = 4

Task 5в)
(RECURSIVE_SCALAR '(1 2 3) '(3 2 1)) = 9
(RECURSIVE_SCALAR '(1 2 3) '(3 2)) = NIL

(ITERATIVE_SCALAR '(1 2 3) '(3 2 1)) = 9
(ITERATIVE_SCALAR '(1 2 3) '(3 2)) = NIL