【问题标题】:Function that consumes two lists and produces a list of all second elements使用两个列表并生成所有第二个元素的列表的函数
【发布时间】:2021-02-27 23:11:43
【问题描述】:

在 Racket 博士中,我将如何编写一个使用 2 个列表(每个列表包含 2 个列表元素(第一个是字符串,第二个是数字))并生成所有第二个元素的列表的函数?

如果这个问题很难理解,这里有一个例子:

(second-separator 
      (list (list "JG" 851) (list "Gh" 90)) 
      (list (list "hb" 34) (list "vc" 45) (list "kl" 462)))

应该产生:

(list 851 90 34 45 462)

到目前为止,这是我的代码:

(define (second-separator los1 los2)
  (cond
    [(and (empty? los1) (empty? los2)) empty]
    [(empty? los1) (cons (second (first los2)) 
                         (second-separator los1 (rest los2)))] 
    [(empty? los2) (cons (second (first los1)) 
                         (second-separator (rest los1) los2))]
    [else (list (second (first los1)) 
                (second (first los2)) 
                (second-separator (rest los1) (rest los2)))]))

我的代码适用于除else 之外的所有情况。

如果我插入上面给出的示例,我最终会得到

(list 851 34 (list 90 45 (list 462))) 

而不是

(list 851 90 34 45 462)

我该如何解决这个问题?非常感谢您的帮助。

【问题讨论】:

    标签: list recursion racket


    【解决方案1】:
    [else (list (second (first los1)) 
                (second (first los2)) 
                (second-separator (rest los1) (rest los2)))]))
    

    这是您专门获取嵌套列表的地方。 (list element_1 element_2 ... (recursive call which generates a list) 特别可疑,经常导致嵌套列表,因为它最终会扩展为这样的内容:

    (list elem_1 elem_2 ... (list elem ...))
    

    您正在寻找生成“平面”列表的内容是:

    (cons elem_1 (cons elem_2 ... (recursive call))
    

    (语义上:“链接”elem_2recursive call 生成的列表,然后“链接”elem_1 到生成的列表等等。)

    (append (list elem_1 elem_2 ...) (recursive call))
    

    (同义:将elem_1elem_2 等的列表附加到recursive call 生成的列表中)

    【讨论】:

      【解决方案2】:

      用模式匹配伪代码重新编写,使其更直观,与cond 情况对应的方程式,您的代码变为

      second-separator []  []             =  []
      second-separator []  [[a,b], ...n]  =  [b, ...second-separator [] n]
      second-separator [[a,b], ...n]  []  =  [b, ...second-separator n []]
      second-separator [[a1,b1], ...n1] 
                       [[a2,b2], ...n2]   =  [b1, b2, second-separator n1 n2]
      

      这解释了你得到的输出。对于您描述的输出,它必须是:

      second-separator []  []              =  []
      second-separator []  n2              =  _______________
      second-separator [[a,b], ...n1]  n2  =  [b, ...second-separator n1 n2]
      

      (最重要的等式是最后一个;填空)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-27
        • 2023-03-03
        • 1970-01-01
        • 2015-05-02
        • 1970-01-01
        • 1970-01-01
        • 2021-03-13
        相关资源
        最近更新 更多