我正在尝试在球拍中编写一个函数,该函数接收一个数字列表并输出一个包含这些数字的平方的列表。我试图不使用地图实现,而是递归地解决问题。但是,我现在的代码输出的是输入相同的列表。我的代码如下:
(define (my-square lst)
(cond (cons? lst)
(append (* (first lst) (first lst)) (my-square (rest lst)))))
我感谢任何帮助!
答案 0 :(得分:1)
基本情况是错误的(它应该要求空列表),cons
应该用于递归构建列表(而不是append
)。此外,您还有一些关于括号的错误,应使用cond
指定else
中的最后一个条件。这是构建输出列表的标准模板:
(define (my-square lst)
(cond ((empty? lst)
empty)
(else
(cons (* (first lst) (first lst))
(my-square (rest lst))))))
这对于从头开始编写的解决方案来说很好,但是在Racket中解决这个问题的惯用方法是使用更高阶的函数,例如map
- 所以我们不重新发明轮子: / p>
(define (my-square lst)
(map (lambda (x) (* x x)) lst))
无论哪种方式,它都按预期工作:
(my-square '(1 2 3 4 5))
=> '(1 4 9 16 25)
答案 1 :(得分:0)
append
应为cons
,您应该在lst
为空时处理此案例。最后,cond
条件应包含在括号中:
(define (my-square lst)
(cond ((cons? lst) (cons (* (first lst) (first lst)) (my-square (rest lst))))
(#t '())))