Skip to content

Instantly share code, notes, and snippets.

@sillykelvin
Created August 27, 2013 02:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sillykelvin/6349027 to your computer and use it in GitHub Desktop.
Save sillykelvin/6349027 to your computer and use it in GitHub Desktop.
Add two numbers presented as two lists, an exercise in Lisp-cn google group. See https://groups.google.com/forum/#!topic/lisp-cn/AVEjxh0A5r0
(define (list-add lst1 lst2)
(define (iter a1 a2 carry ret)
(cond ((and (null? a1) (null? a2))
(if carry
(append ret '(1))
ret))
((null? a1)
(if carry
(iter '(1) a2 #f ret)
(append ret a2)))
((null? a2)
(if carry
(iter a1 '(1) #f ret)
(append ret a1)))
(else (let ((r (+ (car a1)
(car a2)
(if carry 1 0))))
(if (>= r 10)
(iter (cdr a1)
(cdr a2)
#t
(append ret (list (- r 10))))
(iter (cdr a1)
(cdr a2)
#f
(append ret (list r))))))))
(iter lst1 lst2 #f '()))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment