代码“ tsFunc”将两个列表作为输入,并将两个列表中的每个元素配对。它适用于大多数情况。但是当我给出两个相等长度的列表时,我发现了一个奇怪的行为(例如'(1 2)'(3 4)....或'(abc)'(1 2 3)....,它可以工作奇怪的是,首先,这是代码。
[问题1]
(define (tsFunc lst1 lst2)
(define (helper ls1 ls2 rst)
(reverse (if (or (null? ls1) (null? ls2))
rst
(helper (cdr ls1) (cdr ls2)
(cons (cons (car ls1) (car ls2)) rst)))))
(helper lst1 lst2 '()))
这样的行为:
1)列表长度不均匀的正确行为:(tsFunc'(1 2 3)'(ab))====>输出:((1。a)(2。b))
2)具有偶数长度的列表的奇怪行为:(tsFunc'(1 2 3)'(abc))===>输出(错误):((3 .c)(2. b)(1 .a))= ==>预期的:((1.a)(2.b)(3.c))
当两个输入列表的长度相同时,会发生什么情况?tsFunc逻辑在长度相同的输入列表与长度不同的输入列表之间有不同的行为吗?(请注意。据我所知,代码需要对最终结果进行“反转”。因此,这并不是因为代码中的“反转”)
[问题2]的结果为tsFunc => tsFunc结果:(1。2)(3。4)=>尝试实现这样的乘积(1 * 2)+(3 * 4)= 14,所以我喜欢这..
(define (func l1 l2)
(tsFunc (l1 l2) ;; line 2 - how to call tsFunc's result??
(foldl (lambda (acc pair) ;; line 3
(+ acc (* (car pair) (cdr pair)))) ;; line 4
'()
l1 l2))) ;; like this?? or ??
第3行,第4行ok ..那是逻辑,然后如何调用tsFunc结果以将其用作输入,以及最后一行的两个列表..不清楚。
第一个问题是您在每次迭代时都会反转列表,如果确实需要反转输出,请在最后只执行一次:
(define (tsFunc lst1 lst2)
(define (helper ls1 ls2 rst)
(if (or (null? ls1) (null? ls2))
(reverse rst)
(helper (cdr ls1) (cdr ls2)
(cons (cons (car ls1) (car ls2)) rst))))
(helper lst1 lst2 '()))
现在,对于第二个问题-代码甚至无法编译:您没有正确地调用该tsFunc
过程,并且在错误的地方调用了它。另外,accumulator参数的初始值是错误的-如果要返回数字,则不能使用列表:
(define (func l1 l2)
(foldl (lambda (acc pair)
(+ acc (* (car pair) (cdr pair))))
0
(tsFunc l1 l2)))
使用问题中的样本输入,这是它的工作方式:
(func '(1 3) '(2 4))
=> 14
在上面tsFunc
以'(1 3)
和'(2 4)
作为输入,将它们转换为所需的内容'((1 . 2) (3 . 4))
,然后对其进行foldl
预成型(1*2)+(3*4) = 14
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句