代码"tsFunc"获取两个列表作为输入,并将两个列表中的每个元素配对。这在大多数情况下都有效。但后来我发现有点奇怪的行为,当我给2个相等长度的列表(例如:"(1 2)"(3 4)……(a b c)(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)'(a b)) ====>输出:((1);2 .选A。b))
2)偶数长度列表的奇怪行为:(tsFunc '(1 2 3)'(a b c)) ===>输出(错误):2 .选C。1 .选B。一))===>期望:(1);2 .选A。3 .选B。c ))
当两个输入列表长度相同时,会发生什么?tsFunc逻辑在相同长度的输入列表与不同长度的输入列表之间有不同的行为吗?(注意。据我所知,代码需要有"反向"的最终结果。所以它不是因为代码中的"reverse")
[问题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
,如预期的那样
既然允许使用高阶函数,为什么不直接使用SRFI-1 List库fold
呢?
#!r6rs
(import (rnrs base)
(only (srfi :1) fold)) ;; srfi-1 fold stop at the shortest list
(define (func lst1 lst2)
(fold (lambda (x y acc)
(+ acc (* x y)))
0
lst1
lst2))
(func '(1 3) '(2 4 8)) ; ==> 14