-1
(define depth-count
  (lambda (l)
    (let ((visited '())
          (counter 0))
      (let iter ((l l))
         (cond ((pair? l) 
                (if (memq l visited)
                    (set! counter (+ 1 counter))
                    (begin
                       (set! visited (cons l visited))
                       (iter (car l))
                       (iter (cdr l)))))
               (else '()))) counter)))

恕我直言,那个 else 分支是不必要的或只是错误的,但是该代码似乎可以工作,但我不确定..当我有..让我们说

(define l0 '(a b c))
(set-car! l0 l0)
(set-car! (cdr l0) l0)
(depth-count l0)

它应该返回 2,对吧?那是正确的吗?

4

1 回答 1

0

你说得对,表达(else '())是多余的。这意味着您的cond表达式有时会评估为空列表。因此,您的内部let有时会评估为空列表。

这是多余的,因为您没有将内部let的结果用于任何事情。结果被外部let丢弃,它返回其最终子表达式的值:counter

是的,对于您建议的输入,2 是一个合理(可预测的)结果。

至于它的正确性,您确实需要更清楚地说明您要达到的目标。“循环列表”的“深度”不是一个定义明确的概念。

于 2014-05-18T21:36:15.017 回答