Scheme 深度循环表

Scheme 深度循环表,scheme,cyclic,Scheme,Cyclic,恕我直言,else分支是不必要的,或者只是错误的,但是代码似乎可以工作,但我不确定。。 当我有。。比方说 (define depth-count (lambda (l) (let ((visited '()) (counter 0)) (let iter ((l l)) (cond ((pair? l) (if (memq l visited) (set! co

恕我直言,else分支是不必要的,或者只是错误的,但是代码似乎可以工作,但我不确定。。 当我有。。比方说

(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)))

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

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

这是多余的,因为你没有用内在let的结果做任何事情。结果被外部let丢弃,它返回其最终子表达式的值:
计数器

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


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

请将其分为两个独立的问题。否则,如果一个人回答了你的第一个问题,而另一个人回答了第二个问题,你会接受谁的答案?那么你的程序会计算有多少个自我介绍?这和深度有什么关系?
(define l0 '(a b c))
(set-car! l0 l0)
(set-car! (cdr l0) l0)
(depth-count l0)