【问题标题】:LCS(longest common subsequence) in SchemeScheme中的LCS(longest common subsequence)
【发布时间】:2018-12-09 22:36:17
【问题描述】:

我尝试使用Scheme来实现LCS算法,但是有一个bug。

(定义 X (列表#\A#\B#\C#\B#\D#\A#\B))

(定义 Y (列表#\B#\D#\C#\A#\B#\A))

(定义前缀 (λ (i s) (如果(= 我 0) '() (缺点(汽车) (前缀(-i 1) (cdr s)))))))

(定义(选择 ith s) (如果(= 第 1 个) (汽车) (选择( - ith 1) (cdr s))))

(定义 (LCS x y) (定义(最优 i j) (条件 ((或 (= i 0) (= j 0)) 0) ((eq?(选择 i x) (选择 j y)) (+ 1 (最佳 (- i 1) (- j 1)))) (否则(最大(LCS(前缀(-i 1)x)y) (LCS x (前缀 (- j 1) y)))))) (最佳(长度 x) (长度 y)))

1 ]=>(加载“lcs.scm”)

;加载“lcs.scm”...完成 ;值:lcs

1 ]=> (lcs X Y)

;值:5

结果应该是4,不知道bug在哪里。

【问题讨论】:

  • 把它分成更小的部分。检查每个部分是否正常工作。

标签: scheme lcs


【解决方案1】:

您收到错误是因为您在优化中的最终递归调用不正确。 您为x 使用前缀i-1 或为j-1 使用y,但另一个呢? ji 可能小于相应字符串的长度,因此,您需要相应地为参数添加前缀。

以下代码可以正常工作。

(define (LCS x y)
  (define (optimal i j)
    (cond
      ((or (= i 0) (= j 0)) 0)
      ((eq? (pick i x) (pick j y)) (+ 1 (optimal (- i 1) (- j 1))))
      (else (max (LCS (prefix (- i 1) x) (prefix j y)) (LCS (prefix i x) (prefix (- j 1) y))))))
  (optimal (length x) (length y)))

请注意,这个问题的存在只是因为您混合了两种不同类型的调用。一个在前缀上调用LCS,另一个调用optimal,i 和j 较小。 您可以将 LCS 调用替换为最简单的解决方案。

(define (LCS x y)
  (define (optimal i j)
    (cond
      ((or (= i 0) (= j 0)) 0)
      ((eq? (pick i x) (pick j y)) (+ 1 (optimal (- i 1) (- j 1))))
      (else (max (optimal (- i 1) j) (optimal i (- j 1))))))
  (optimal (length x) (length y)))

【讨论】:

  • 感谢您的宝贵时间!我相信我现在明白了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 2011-10-17
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
相关资源
最近更新 更多