【问题标题】:Can I make this iterative process recursive in scheme?我可以在方案中使这个迭代过程递归吗?
【发布时间】:2012-10-30 16:45:48
【问题描述】:

我在 Scheme 中有这个迭代过程。 (其实我真的不知道到底是个什么样的过程)

(define (contains-double? lst)
 (cond
  ((or (null? lst) (null? (cdr lst))) #f)
  ((eq? (car lst) (cadr lst)) #t)
  (else (contains-double? (cdr lst)))))

它检查是否有 2 个相同的数字彼此相邻。 例如:

(contains-double? '(1 2 3 3 3 5 2))    => #t
(contains-double? '(1 2 3 5 3 2))      => #f
(contains-double? '(1 2 3 2 2))        => #t

我可以让这个过程递归吗?

提前致谢

【问题讨论】:

    标签: recursion process scheme procedure iteration


    【解决方案1】:

    问题中的过程是递归的(contains-double? 正在调用自己),但它生成的过程是迭代的,因为该过程是用尾递归风格编写的——这意味着在过程从递归调用,除了返回它的值。

    这个过程生成的过程可以通过去掉尾递归来实现递归:

    (define (contains-double? lst)
      (if (or (empty? lst) (empty? (rest lst)))
          #f
          (or (contains-double? (rest lst))
              (= (first lst) (second lst)))))
    

    【讨论】:

    • 您的代码仍然是尾递归的。 ;-) 您可以通过交换 or 的两个分支使其成为非尾递归:这会将其变为右折叠而不是当前的左折叠。
    • @ChrisJester-Young 谢谢,已修复。我怀疑 or 是否算作尾递归,因为短路评估
    猜你喜欢
    • 2017-03-08
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 2016-05-09
    • 2015-03-16
    • 1970-01-01
    • 2020-12-21
    相关资源
    最近更新 更多