2

好的,我是 Scheme 的新手,我以为我理解它,但对这个问题感到困惑。我想对列表的所有元素进行平方。因此,(mapsq '(1 2 3)) 返回 (list 1 4 9)。

我的代码:

(define mapsq
  (lambda (ls)
    (cond ((null? ls) 0)
          (else (cons (car ls) (car ls))
                (mapsq (cdr ls)))))))
4

3 回答 3

3

在实际(非学术)环境中,可以使用以下map过程轻松解决此问题:

(define mapsq
  (lambda (ls)
    (map (lambda (x) (* x x))
         ls)))

当然,如果这是家庭作业并且您需要从头开始实施解决方案,那么我不应该提供答案。最好自己找出解决方案,填空:

(define mapsq
  (lambda (ls)
    (cond ((null? ls)               ; If the list is empty
           <???>)                   ; ... then return the empty list.
          (else                     ; Otherwise
           (cons (* <???> <???>)    ; ... square the first element in the list
                 (mapsq <???>)))))) ; ... and advance the recursion.

您的解决方案中有两个问题:首先,基本情况不应该返回0- 如果我们正在构建一个列表作为答案,那么您必须返回空列表。其次,在递归步骤中,您实际上并没有对列表中的当前元素进行平方 - 为此只需将其与*运算符相乘。

于 2012-10-21T23:32:03.023 回答
1
(define (mapsq xs)
  (map * xs xs))

> (mapsq '(1 2 3 4 5))
'(1 4 9 16 25)
于 2013-01-30T18:57:20.757 回答
1

你可以这样写:

(define (mapsq xs)
  (define (square x) (* x x))
  (map square xs))

或这个:

(define (mapsq xs)
  (map (lambda (x) (* x x)) xs))

或者可能是这样的:

(define (mapsq xs)
  (let loop ((xs xs) (sqs '()))
    (if (null? xs)
        (reverse sqs)
        (loop (cdr xs) (cons (* (car xs) (car xs)) sqs)))))

甚至像这样:

(define (mapsq xs)
  (if (null? xs)
      '()
      (cons (* (car xs) (car xs)) (mapsq (cdr xs)))))

我的偏好将是第一个选择。第二个选项较短,但辅助功能使第一个选项更易于阅读。我可能不会使用第三个或第四个选项。

顺便说一句,laser_wizard 的解决方案也不起作用。

我注意到你是新来的。如果您喜欢某个答案,请单击答案旁边的向上箭头,以便给出答案的人获得积分;这个标记还让读者社区知道答案中有一些有价值的东西。一旦您确信答案是正确的,请单击答案旁边的复选标记;这也给给出答案的人加分,更重要的是让其他读者知道你认为这个答案最正确地解决了你的问题。

于 2012-10-21T23:29:37.957 回答