【问题标题】:Racket: Recursive List Creation from 2 ListsRacket:从 2 个列表创建递归列表
【发布时间】:2018-03-10 05:32:50
【问题描述】:

我应该创建一个函数,它接受两个列表作为参数,并通过组合输入列表返回一个对列表,其中对是给定索引处元素的组合。

输入示例:

(zipper '(1 2 3) '(4 9 5 7))

示例输出:

'((1 4) (2 9) (3 5)) 

如果一个输入列表比另一个长,则忽略较长列表中的额外元素。实现必须是递归的。

我创建的代码:

(define (zipper list1 list2)
(if (or (empty? list1) (empty? list2))
  '()
(list (list (zipper (rest list1) (rest list2)) ))))

输出:

'((((((((()))))))))
'((((((()))))))
'()

有人可以帮忙吗?我也尝试过使用“缺点”将元素放在一起,所以不确定元素是如何丢失的。我是 Racket 的新手。谢谢。

【问题讨论】:

  • 测试用例中的这个 a b c 来自哪里?提供更多的测试用例。我确信我可以做到,但不能使用给定的信息(什么是单对列表?这不是您的输出说明的内容。您的意思是一对列表?)
  • 你是绝对正确的。我将错误的测试用例复制到我的帖子中。已编辑。

标签: recursion functional-programming scheme racket


【解决方案1】:

非常简单,我们所要做的就是创建一个函数,如果任一列表为空,则该函数将返回空作为基本情况,否则我们会将 (first list1, first list2) 用于递归调用。

(define (zipper list1 list2)
  (cond [(or (empty? list1)
             (empty? list2)) empty]
        [else (cons 
               (cons (first list1)
                     (first list2)) ;; List of first elements
               (zipper (rest list1) (rest list2)))]))

【讨论】:

  • 说得好。感谢您的帮助,我真的很感激。使用您发布的代码,我得到了 (1 . a) 等的输出,因此我将 else 块中的第二个“cons”命令调整为“list”并修复了它。
  • @BrianJay 也 (map list list1 list2) 做同样的事情。 srfi-1 map 停在最短的列表。
猜你喜欢
  • 2021-05-18
  • 2020-04-08
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 2021-10-20
相关资源
最近更新 更多