深度循环列表

时间:2014-05-18 19:19:31

标签: scheme cyclic

(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)))
Imho,其他分支是不必要的或只是错误,但是该代码似乎有效,但我不确定.. 当我有......让我们说

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

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

1 个答案:

答案 0 :(得分:0)

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

这是多余的,因为你没有使用内部 let 的结果。结果被外部 let 抛弃,后者返回其最终子表达式的值:counter

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

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