方案:在列表上进行操作而不更改其副本?

时间:2013-10-26 15:42:50

标签: list scheme

我有一个帮助者来复制一个列表:

(define (list-copy list)
  (if (null? list)
      '()
      (cons (car list) (list-copy (cdr list)))))

然后,

(define (multList lst1 lst2)
  (define lstCopy2 (list-copy lst2))  
  (cond ((null? lst1) ())
        ((eq? (length lst1) (length lst2)) (cons (* (car lst1) (car lst2)) (multList (cdr lst1) (cdr lst2)))) 
        ((> (length lst1) (length lst2))
         (if (null? lst2) lstCopy2
         (cons (* (car lst1) (car lst2)) (multList (cdr lst1) (cdr lst2)))))
        (else '())))

我正在尝试将lst2复制到lstCopy2然后我希望lstCopy2在我使用lst2时保持完整,以便在开始时调用lst2(在lstCopy2的帮助下)。 在我的第三个cond(当lenght lst1> lenght lst2)时lst2 =()我想继续这个过程,直到lst1是()。

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

据我所知,您的副本未被使用。此外,该过程都不会改变任何内容,因此对于列表的每个递归/元素,(equal? lst2 lstCopy2)始终为#t

如果lst1lst2短,或者您已到达列表末尾,则会出现错误,因为()是非法表达式。也许你的意思是'()

这可以写得更容易:

(require srfi/1)

(define (multList lst1 lst2)
  (define (aux lst1 lst2)
    (if (null? lst2)
        '()
        (cons (* (car lst1) 
                 (car lst2)) 
              (aux (cdr lst1) (cdr lst2)))))
  (aux (apply circular-list lst1) lst2))

(multList '(1 -1) '(1 2 3 4 5 6)) ; ==> (1 -2 3 -4 5 -6)

;; with srfi-1-version of map we can use it to make the code shorter
(define (multList lst1 lst2)
  (map * (apply circular-list lst1) lst2))

答案 1 :(得分:1)

你会以非常奇怪的方式解决这个问题。执行此操作的标准方法是定义内部函数。通常你是内部函数,然后调用它。

你这样做的方式每次调用multList时都会复制lst2,这不是我想要的。

但是我没有看到你实际引用原始第二个列表的位置,所以我没有看到你想要做什么的原因。

(define (multList oL1 oL2)
  (define (helper lst1 lst2)
     (cond ((null? lst1) '())   
           ((null? lst2) (helper lst1 oL2))
           (else
            (cons (* (car lst1) (car lst2)) 
                  (helper (cdr lst1) (cdr lst2))))))
  (helper oL1 oL2))

(multlist '(9 2 4) '(1 2))

;Value 14: (9 4 4)

(multlist '(1 2) '(9 2 4))

;Value 15: (9 4)

看看我的意思并不是真正的正确乘法? (multist a b)并不总是与(multlist b a)相同。