List 球拍“;第一:需要一个非空列表;给定值:空";

List 球拍“;第一:需要一个非空列表;给定值:空";,list,debugging,recursion,scheme,racket,List,Debugging,Recursion,Scheme,Racket,我在写一些代码,在给定一个自然数列表的情况下输出一个阶乘列表。所以(清单143)会给出(清单1246)。当前Racket在与(cons…)联机时给我错误“first:期望非空列表;given:empty”。我使用调试器进行检查,代码永远不会为空,有没有办法解决这个问题 (define (factorialize arr) (cond [(empty? arr) empty] [else (cons (factorial (first arr)) (factorialize (f

我在写一些代码,在给定一个自然数列表的情况下输出一个阶乘列表。所以(清单143)会给出(清单1246)。当前Racket在与(cons…)联机时给我错误“first:期望非空列表;given:empty”。我使用调试器进行检查,代码永远不会为空,有没有办法解决这个问题

(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)))]))

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

(define (factorialize arr)
  (cond
    [(empty? arr) empty]
    [else (cons (factorial (first arr))
                (factorialize (rest arr)))]))
仅供参考,更简单、更惯用的实现将使用内置的高阶过程:

(define (factorialize arr)
  (map factorial arr))
无论哪种方式,它都能按预期工作:

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