【问题标题】:Racket "first: expects a non-empty list; given: empty"球拍“第一个:需要一个非空列表;给定:空”
【发布时间】:2021-01-24 00:13:37
【问题描述】:

我正在编写一些代码,在给定自然数列表的情况下输出阶乘列表。所以 (list 1 4 3) 会给出 (list 1 24 6)。目前,当与 (cons ......) 在线时,Racket 给我错误“首先:需要一个非空列表;给定:空”。我使用调试器检查,代码永远不会为空,有没有办法解决这个问题?

(define (factorialize arr)
 (cond
    [(empty? arr) empty]
    [else (cons (factorial (first arr)) (factorialize (factorial (first (rest arr)))))]))

;;helper function
(define (factorial num)
  (cond
    [(= 0 num) 1]
    [else (* num (factorial (- num 1)))]))

【问题讨论】:

    标签: list debugging recursion scheme racket


    【解决方案1】:

    递归步骤不对,为什么叫(factorialize (factorial (first (rest arr))))?这试图在factorial 的结果上应用factorialize,这是一个数字,而不是factorialize 所期望的列表。您只需要通过调用列表其余部分的过程来推进递归!试试这个:

    (define (factorialize arr)
      (cond
        [(empty? arr) empty]
        [else (cons (factorial (first arr))
                    (factorialize (rest arr)))]))
    

    仅供参考,更简单、更惯用的实现将使用内置的map 高阶过程:

    (define (factorialize arr)
      (map factorial arr))
    

    无论哪种方式,它都按预期工作:

    (factorialize '(1 4 3))
    => '(1 24 6)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-18
      • 1970-01-01
      • 2021-09-03
      • 2011-01-03
      • 1970-01-01
      相关资源
      最近更新 更多