CS代考 COMP712 Tutorial Extra-1 ans:

COMP712 Tutorial Extra-1 ans:

1. Write a function, find-even, that returns the first even number in a list.

> (find-even ‘(1 2 3 4))
2

> (find-even ‘(1 (3 4) a 9 (2 2) 10))
10

> (find-even ‘(1 (3 4) a 9 (2 2) 11))
nil

(defun find-even (L &optional (x (car L)))
(cond ((null L) nil)
((and (numberp x) (evenp x)) x)
(t (find-even (cdr L)))))

This example shows how you could use &optional to compute something once and use it throughout the function.

2. Write a function, split, which given a list will return a list of two lists, the length of the first is specified as the second argument which is a number greater than zero:

> (split ‘(1 2 3 4) 2)
((1 2) (3 4))

> (split ‘(1 2 3 4 5 6 7) 5)
((1 2 3 4 5) (6 7))

> (split ‘(1 2 3) 4)
((1 2 3) nil)

(defun split (L n &optional first-list)
(cond ((or (zerop n) (null L)) (list (reverse first-list) L))
(t (split (cdr L) (1- n) (cons (car L) first-list)))))

3. Write a function, lotto, that generates six numbers for you. You may use the function, random, that will give you a random number as shown below:

· (random 40) ;return a number <= 40 39 But, beware the function, random, returns 0 – 40 and hence you have to remove zero if generated. Also, you don’t want to include a number that has already been generated. > (lotto)
(3 7 20 40 32 11)

(defun lotto ()
(let* ((a (my-random))
(b (my-random a))
(c (my-random a b))
(d (my-random a b c))
(e (my-random a b c d))
(f (my-random a b c d e)))
(list a b c d e f)))

(defun my-random (&rest existing-num)
(do ((x (random 40) (random 40)))
((and (> x 0) (not (member x existing-num))) x)))

4. Write a function sum-tree which given a binary tree will return the sum of all its leaf nodes:

; the tree as above
> (sum-tree ‘(a (b (c 2 3) (d 2 3)) (e (f 43 (h 1 9)) 30))))
93

(defun sum-tree (L)
(let ((left-tree (second L)) (right-tree (third L)))
(+ (if (numberp left-tree) left-tree (sum-tree left-tree))
(if (numberp right-tree) right-tree (sum-tree right-tree)))))

The solution is quite straightforward – so don’t be deterred by the apparent complexity of the question.

(a )

(b ) (e )

(f )

(h )

(c )

2 3

(d )

2 3

30

43

1 9

(a )
(b )
(e )
(f )
(h )
(c )
2 3
(d )
2 3
30
43
1
9