写方案LISP Atomic_Count

时间:2014-10-22 16:16:38

标签: racket

有人可以帮我解决这个问题吗?

  • (定义test1'(c o 2(h 2 o)3 o 2))
  • (定义test2'(h 2 o))
  • (定义test3'(c o 2 o 2))
  • (atomic_count test1)返回14
  • (atomic_count test2)返回3
  • (atomic_count test3)返回5

1 个答案:

答案 0 :(得分:0)

不太难,主要的一点是你需要某种缓冲区(在我的例子中称为prev)来等待可能的乘法:

 
(define (atomic_count lst)
  (let loop ((lst lst) (prev 0))
    (if (null? lst) 
        prev
        (let ((elt (car lst)))
          (cond
            ((list? elt)   (+ prev (loop (cdr lst) (loop elt 0))))
            ((number? elt) (loop (cdr lst) (* prev elt)))
            (else          (+ prev (loop (cdr lst) 1))))))))

测试:

> (atomic_count '(c o 2 (h 2 o) 3 o 2))
14
> (atomic_count '(h 2 o))
3
> (atomic_count '(c o 2 o 2))
5