【问题标题】:Racket Recursive Square Function球拍递归平方函数
【发布时间】:2015-04-17 15:52:02
【问题描述】:
我正在尝试在球拍中编写一个函数,该函数接受一个数字列表并输出一个包含这些数字平方的列表。我试图不使用地图实现,而是递归地解决问题。但是,我现在拥有的代码正在输出与输入相同的列表。我的代码如下:
(define (my-square lst)
(cond (cons? lst)
(append (* (first lst) (first lst)) (my-square (rest lst)))))
感谢您的帮助!
【问题讨论】:
标签:
list
recursion
racket
【解决方案1】:
append应该是cons,当lst为空时你应该处理这种情况。最后,cond 条件应该用括号括起来:
(define (my-square lst)
(cond ((cons? lst) (cons (* (first lst) (first lst)) (my-square (rest lst))))
(#t '())))
【解决方案2】:
基本情况是错误的(它应该要求空列表),cons 应该用于递归构建列表(而不是 append)。此外,您有几个关于括号的错误,cond 中的最后一个条件应使用else 指定。这是构建输出列表的标准模板:
(define (my-square lst)
(cond ((empty? lst)
empty)
(else
(cons (* (first lst) (first lst))
(my-square (rest lst))))))
这对于从头编写的解决方案来说很好,但在 Racket 中解决这个问题的惯用方法是使用高阶函数,例如 map - 所以我们不会重新发明轮子:
(define (my-square lst)
(map (lambda (x) (* x x)) lst))
无论哪种方式,它都按预期工作:
(my-square '(1 2 3 4 5))
=> '(1 4 9 16 25)