School Commit Init
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
;5.
|
||||
;a) Write twice the n-th element of a linear list. Example: for (10 20 30 40 50) and n=3 will produce (10 20 30 30 40 50).
|
||||
|
||||
;duplicate-nth-element(l1l2...ln, n) =
|
||||
; empty list if l1l2...ln is empty
|
||||
; l1 + l1l2...ln if n = 1
|
||||
; l1 + duplicate-nth-element(l2...ln, n) otherwise
|
||||
|
||||
(defun duplicate-nth-element (lst n)
|
||||
(cond
|
||||
((null lst) nil)
|
||||
((< n 1 ) lst )
|
||||
((= n 1) (cons (car lst) lst))
|
||||
(t (cons (car lst) (duplicate-nth-element (cdr lst) (- n 1))))
|
||||
)
|
||||
)
|
||||
|
||||
(print (duplicate-nth-element '(10 20 30 40 50) 3))
|
||||
(print (duplicate-nth-element '(10 20 30 40 50) 30))
|
||||
(print (duplicate-nth-element '(10 20 30 40 50) -1))
|
||||
|
||||
|
||||
;b) Write a function to return an association list with the two lists given as parameters.
|
||||
; Example: (A B C) (X Y Z) --> ((A.X) (B.Y) (C.Z)).
|
||||
|
||||
;create-association-list(l1l2...ln, m1m2...mn) =
|
||||
; empty list if l1l2...ln and m1m2...mn are empty
|
||||
; (l1, m1) + create-association-list(l2...ln, m2...mn) otherwise
|
||||
; (l1, nil) + create-association-list(l2...ln, m1m2...mn) if m1m2...mn is empty
|
||||
; (nil, m1) + create-association-list(l1l2...ln, m2...mn) if l1l2...ln is empty
|
||||
(defun create-association-list (list1 list2)
|
||||
(if (and (null list1) (null list2))
|
||||
'()
|
||||
(let ((key (car list1))
|
||||
(value (car list2)))
|
||||
(cons (cons key value)
|
||||
(create-association-list (cdr list1) (cdr list2))))))
|
||||
|
||||
(print (create-association-list '(A B C) '(X Y Z)))
|
||||
(print (create-association-list '(A B) '(X Y Z)))
|
||||
(print (create-association-list '(A B C) '(X Y)))
|
||||
|
||||
;c) Write a function to determine the number of all sublists of a given list, on any level. A sublist is either the list itself, or any element that is a list, at any level. Example:
|
||||
;(1 2 (3 (4 5) (6 7)) 8 (9 10)) => 5 lists:
|
||||
;(list itself, (3 ...), (4 5), (6 7), (9 10)).
|
||||
|
||||
;count-sublists-helper(l1l2...ln) =
|
||||
; 0 if l1l2...ln is empty
|
||||
; 1 + count-sublists-helper(l2...ln) + count-sublists-helper(l1) if l1 is a list
|
||||
; count-sublists-helper(l2...ln) otherwise
|
||||
(defun count-sublists-helper (lst)
|
||||
(if (null lst)
|
||||
0
|
||||
(let ((head (car lst))
|
||||
(tail (cdr lst)))
|
||||
(if (listp head)
|
||||
(+ 1 (count-sublists-helper head) (count-sublists-helper tail))
|
||||
(count-sublists-helper tail)))))
|
||||
|
||||
;count-sublists(lst) =
|
||||
; 0 if lst is empty
|
||||
; 1 + count-sublists-helper(lst) otherwise
|
||||
(defun count-sublists (lst)
|
||||
(if (listp lst)
|
||||
(+ 1 (count-sublists-helper lst))
|
||||
0))
|
||||
|
||||
|
||||
(print (count-sublists '(1 2 (3 (4 5) (6 7)) 8 (9 10))))
|
||||
(print (count-sublists '(1 2 (3 (4 5) (6 7)) 8 (9 10) (11))))
|
||||
|
||||
;d) Write a function to return the number of all numerical atoms in a list at superficial level.
|
||||
|
||||
;count-numerical-atoms(l1l2...ln) =
|
||||
; 0 if l1l2...ln is empty
|
||||
; 1 + count-numerical-atoms(l2...ln) if l1 is a number
|
||||
; count-numerical-atoms(l2...ln) otherwise
|
||||
(defun count-numerical-atoms (lst)
|
||||
(if (null lst)
|
||||
0
|
||||
(let ((head (car lst))
|
||||
(tail (cdr lst)))
|
||||
(if (numberp head)
|
||||
(+ 1 (count-numerical-atoms tail))
|
||||
(count-numerical-atoms tail)))))
|
||||
|
||||
(print(count-numerical-atoms '(1 2 (3 (4 5) (6 7)) 8 (9 10))))
|
||||
|
||||
(exit)
|
||||
|
||||
Reference in New Issue
Block a user