(defun q1 (L)
(cond
((not (listp L)) (setf L nil))
((null L) (setf L '()))
((< (length L) 2) (setf (car L) nil))
(t (setf (cadr L) (car L)))))
(defvar L1 nil)
(defvar L2 '(5 10 15 20))
| good grief, when I transferred the quiz to VIULearn on our snowy Monday I chopped out the two lines for (part a) and (part b) that showed the actual calls (q1 L1) and (q1 L2). Some of you assumed it was meant to be called on L1,L2, others answered what was literally asked: I'll accept either approach. | |
(a) (q1 L1) Sample Solution L1 is nil, i.e. call is (q1 nil) q1 sets its parameter L to nil, which it was anyway since the L nil was just a copy of L1 it has no effect on L1, which is also still nil |
(b) (q1 L2)
Sample Solution
q1 is passed the reference to L2, the list (5 10 15 20)
the list length is > 2 so the default case applies,
setting the second element (cadr) equal to the first (car)
thus the list is now (5 5 15 20)
and since q1 is working through a reference to L2
this *is* changing the content of L2
|
; original version
(defun q4 (L i)
"returns the ith element of list L"
(nth i L))
Sample solution
; ... you can probably tell from the q4 that I originally had this listed as question 4 ;)
(defun q4 (L i)
"returns the ith element of list L"
(cond
; make sure L and i have valid types before trying to work with them
((not (listp L)) (format t "Error: list expected, got ~A~%" L))
((not (integerp i)) (format t "Error: integer expected, got ~A~%" i))
; make sure i is in the valid range: 0..(length of L - 1)
((< i 0) (format t "Index, ~A, must be > 0~%" i))
((>= i (length L)) (format t "Error: index, ~A, must be < list length ~A~%" i (length L)))
; general (valid values) case
(t (nth i L))))
|
; original version
function q3(integer a, integer b)
begin
if (a < b) then
q3(a + 1, b - 1)
endif
print(a, b)
end
Sample solution
; solution would need to maintain a list or array of pairs queued up for printing,
; and the final/base case recursive call would print the accumulated list
; from last to first
; since it's just pseudo-code I don't mind if you're pretty loose with
; how you set up the list/array for the pairs
; my q3 will rely on a helper to do the recursion in a tail recursive fashion
function q3(integer a, integer b)
begin
int pairs[Maxpairs][2]
helper(a, b, pairs, 0)
end
function helper(integer a, integer b, integer pairsSoFar[][], integer numSoFar = 0)
begin
if (a >= b) then
printPairs(pairsSoFar, numSoFar-1)
else
pairsSoFar[numSoFar][0] = a
pairsSoFar[numSoFar][1] = b
helper(a+1, b-1, pairsSoFar, numSoFar+1)
endif
end
; tail recursive helper function to do the printing at the end
function printPairs(integer pairsSoFar[][], integer index)
begin
if (index >= 0) then
print(pairsSoFar[index][0], pairsSoFar[index][1])
endif
if (index > 0) then
printPairs(pairsSoFar, index-1)
endif
end
|
; original version
(defun q4 ( )
(let ((a nil) (b nil) (sum 0))
(format t "Enter two integers~%")
(setf a (read-line))
(setf b (read-line))
(if (realp a) (setf sum (+ sum a)))
(if (realp b) (setf sum (+ sum b)))
sum))
Sample solution
; the original code is actually kinda borked since read-line will return a string
; (well, array of char) so realp will always fail and the sum will always be 0
; new version with helper function (here eliminating the sequencing aspects also)
(defun helper ( dummy a b sum )
(+ 0 (if (realp a) a 0) (if (realp b) b 0)))
(defun fp4 ( )
(helper (format t "Enter two integers~%") (read-line) (read-line) 0))
|