球拍递归方波函数

时间:2015-02-17 01:27:26

标签: list recursion racket

我正在尝试在球拍中编写一个函数,该函数接收一个数字列表并输出一个包含这些数字的平方的列表。我试图不使用地图实现,而是递归地解决问题。但是,我现在的代码输出的是输入相同的列表。我的代码如下:

  (define (my-square lst)
         (cond (cons? lst)
               (append  (* (first lst) (first lst))  (my-square (rest lst)))))

我感谢任何帮助!

2 个答案:

答案 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 '())))