我有一个帮助者来复制一个列表:
(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是()。
感谢您的帮助
答案 0 :(得分:2)
据我所知,您的副本未被使用。此外,该过程都不会改变任何内容,因此对于列表的每个递归/元素,(equal? lst2 lstCopy2)
始终为#t
。
如果lst1
比lst2
短,或者您已到达列表末尾,则会出现错误,因为()
是非法表达式。也许你的意思是'()
?
这可以写得更容易:
(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)相同。