Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 我需要在Scheme中合并两个列表,从每个列表中提取一个元素_List_Merge_Scheme_Racket - Fatal编程技术网

List 我需要在Scheme中合并两个列表,从每个列表中提取一个元素

List 我需要在Scheme中合并两个列表,从每个列表中提取一个元素,list,merge,scheme,racket,List,Merge,Scheme,Racket,这是我写的: (: mmm : (Listof Any) (Listof Any) -> (Listof Any)) (define (mmm list1 list2) (cond [(or (null? list1) (null? list2)) null] (and (cons (first list1) (first list2)) (mmm (rest list1) (rest list2))))) 我给你举个例子: list1: a b c list2:

这是我写的:

(: mmm : (Listof Any) (Listof Any) -> (Listof Any))
(define (mmm list1 list2)
  (cond [(or (null? list1) (null? list2)) null]
        (and (cons (first list1) (first list2)) (mmm (rest list1) (rest list2)))))
我给你举个例子:

list1:  a b c
list2:  1 2 3
answer: ((a 1) (b 2) (c 3))
编辑
它们大小相同

您的代码有几个问题:

基本情况可能是正确的,也可能是错误的——如果输入列表保证大小相同,那么就可以了。如果它们的大小不同,请参阅@Sylvester的答案以获取建议 第二个条件应该以else开头,因为它是最后一个条件,并且这些条件是相互排斥的,而不是与and 您没有正确构建输出列表。要添加的新元素是一个包含两个输入列表的第一个元素的列表,并且必须与调用递归的结果相一致 要修复这些问题,请尝试以下操作-假设输入列表长度相等:

(define (mmm list1 list2)
  (cond [(or (null? list1) (null? list2)) null]
        [else (cons (list (first list1) (first list2))
                    (mmm (rest list1) (rest list2)))]))
现在程序按预期工作:

(mmm '(a b c ) '(1 2 3))
=> '((a 1) (b 2) (c 3))

您的代码有几个问题:

基本情况可能是正确的,也可能是错误的——如果输入列表保证大小相同,那么就可以了。如果它们的大小不同,请参阅@Sylvester的答案以获取建议 第二个条件应该以else开头,因为它是最后一个条件,并且这些条件是相互排斥的,而不是与and 您没有正确构建输出列表。要添加的新元素是一个包含两个输入列表的第一个元素的列表,并且必须与调用递归的结果相一致 要修复这些问题,请尝试以下操作-假设输入列表长度相等:

(define (mmm list1 list2)
  (cond [(or (null? list1) (null? list2)) null]
        [else (cons (list (first list1) (first list2))
                    (mmm (rest list1) (rest list2)))]))
现在程序按预期工作:

(mmm '(a b c ) '(1 2 3))
=> '((a 1) (b 2) (c 3))

如果您知道列表的大小相同,那么它将变得简单:

(define (mmm list1 list2) (map list list1 list2))

注意:如果这是您真正想要的,请用map cons替换map list。您的代码使用了cons,但您的结果示例表明列表就是您想要的。

如果您知道列表的大小相同,那么它将变成:

(define (mmm list1 list2) (map list list1 list2))
注意:如果这是您真正想要的,请用map cons替换map list。您的代码使用了cons,但您的结果示例表明列表是您想要的。

如果允许您使用map,您可以使用:

(define (mmm lst1 lst2) (map (lambda (x y) (list x y)) lst1 lst2))
如果允许您使用map,您可以使用:

(define (mmm lst1 lst2) (map (lambda (x y) (list x y)) lst1 lst2))

顺便说一句,这个函数通常被称为zip,而不是从标签中删除“Scheme”“Typed Racket”不是“Scheme”您是否使用Scheme、Racket或Typed Racket作为您的语言?顺便说一下,此函数通常称为zip,而不是从标记中删除“Scheme”“键入的Racket”不是“Scheme”您是使用Scheme、Racket还是键入的Racket作为您的语言?它看起来不错,但程序在第一行中出错:mmm:Listof any Listof any->Listofany@user2347210那是因为你用的是打字球拍。选择左下角的Determine language from source,并确保这一行位于文件的开头:lang typed/racketit看起来不错,但程序在第一行中犯了一个错误:mmm:Listof any Listof any->Listofany@user2347210那是因为你用的是打字球拍。选择左下角的Determine language from source(从源代码确定语言),并确保这一行位于文件的开头:lang typed/racketI在typed/racket中测试了这一点,我得到了一个类型错误。我给了您一个方案答案。类型化球拍不是方案;请删除问题的“方案”标签。也就是说,map的类型比mmm更通用,这就是为什么您的类型检查会抱怨的原因。我在typed/racket中对此进行了测试,发现了一个类型错误。我给了您一个Scheme答案。类型化球拍不是方案;请删除问题的“方案”标签。也就是说,map的类型比mmm更通用,这就是为什么您的类型检查会抱怨。您知道为什么typed/racket需要列表包装吗?@sylvester我没有使用typed/racket。这个问题我没有答案。你知道为什么打字/拍子需要列表包装吗?@sylvester我没有用打字/拍子。这个问题我没有答案。