首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LCS(最长公共子序列)

LCS(最长公共子序列)
EN

Stack Overflow用户
提问于 2018-07-01 13:17:47
回答 1查看 609关注 0票数 0

我试着用方案来实现LCS算法,但是有一个缺陷。

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

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

(定义前缀(lambda (i s) (if (= i 0) '() (con (car s) (前缀(- i 1) (cdr S)

(定义(pick ith s) (if (= ith 1) (car s) (pick (- ith 1) (cdr S)

(定义(LCS )(定义(最优i)) (cond (或(= i0) (= j0)) 0) ((eq?))(最大(LCS (前缀(- I1) x) y) (LCS x(前缀(- j1)y)(最优长度(长度)(长度y))

1 ]=> (负载"lcs.scm") 加载"lcs.scm"..。已完成;价值: lcs 1 ]=> (lcs ) ;价值:5

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-01 16:34:27

因为最后的最优递归调用是不正确的,所以会得到错误信息。您使用前缀i-1表示xj-1表示y,但另一个呢?ji可能小于各自字符串的长度,因此需要对参数进行相应的前缀。

以下代码正常工作。

代码语言:javascript
复制
(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,另一个用较小的i和j调用optimal,您可以用最优方法替换LCS调用,以获得更简单的解决方案。

代码语言:javascript
复制
(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)))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51123641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档