Scheme 如何改进此算法(LCS)

Scheme 如何改进此算法(LCS),scheme,Scheme,我不想让它一遍遍地跑 问候,, 超常规我知道这应该是两个列表中最长的公共子序列。正如你所说的,它相当慢。如果你想让它工作得更快,你需要采取一种更复杂的方法,而不是像这样粗暴地强迫它;规范解是中描述的动态规划算法 在不完全切换到另一种算法的情况下,可以大大加快解决方案的速度的一种方法是通过计算结果,因为在递归和从列表末尾删除元素时,您将一次又一次地计算相同的中间结果 EDIT:一个简单的方法是使用let子句来避免在底部进行额外的工作,即 (define (lcs lst1 lst2) (

我不想让它一遍遍地跑

问候,,
超常规

我知道这应该是两个列表中最长的公共子序列。正如你所说的,它相当慢。如果你想让它工作得更快,你需要采取一种更复杂的方法,而不是像这样粗暴地强迫它;规范解是中描述的动态规划算法

在不完全切换到另一种算法的情况下,可以大大加快解决方案的速度的一种方法是通过计算结果,因为在递归和从列表末尾删除元素时,您将一次又一次地计算相同的中间结果

EDIT:一个简单的方法是使用
let
子句来避免在底部进行额外的工作,即

  (define (lcs lst1 lst2)
   (define (except-last-pair list)
   (if (pair? (cdr list))
   (cons (car list) (except-last-pair (cdr list)))
   '()))
  (define (car-last-pair list)
   (if (pair? (cdr list))
   (car-last-pair (cdr list))
   (car list)))
  (if (or (null? lst1) (null? lst2)) null
   (if (= (car-last-pair lst1) (car-last-pair lst2))
      (append (lcs (except-last-pair lst1) (except-last-pair lst2)) (cons (car-last-pair lst1) '()))
      (**if (> (length (lcs lst1 (except-last-pair lst2))) (length (lcs lst2 (except-last-pair lst1)))) 
          (lcs lst1 (except-last-pair lst2))
          (lcs lst2 (except-last-pair lst1))))))**

希望它是正确的-我手边没有解释器-但你明白了。

你能描述一下它的作用以及为什么你现在觉得它不好。有没有什么方法可以不用记忆或动态编程来加速它。。?。。只是我不熟悉这些概念…:S
(if (or (null? lst1) (null? lst2)) null
  (let ((front1 (except-last-pair lst1)) (front2 (except-last-pair lst2)))
    (if (= (car-last-pair lst1) (car-last-pair lst2))       
      (append (lcs front1 front2) (cons (car-last-pair lst1) '()))
      (let ((sub-lcs1 (lcs lst1 front2)) (sub-lcs2 (lcs lst2 front1)))
        (if (> (length sub-lcs1) (length sub-lcs2)) 
          sub-lcs1
          sub-lcs2))))