1

我正在尝试编写一个程序来计算平均绩点(GPA),该程序采用成绩列表并输出 GPA。(作为练习,而不是家庭作业)。

测试用例:

(GPA? '(A C B B)) 
3.0

这是我最好的猜测:

(define a 4.0)
(define b 3.0)
(define c 2.0)
(define d 1.0)
(define f 0.0)


(define (mysum lst)
  (let loop ((lst lst) (accum 0))
    (cond
      [(null? lst) accum]
      [else (loop (cdr lst) (+ accum (car lst)))])))

我收到错误:

“+ 中的异常:a 不是数字”

当我运行测试用例时:

(mysum '(1 2 3 a))

它应该返回 10,但不能在过程中将 a 定义为 4.0。

有人可以给我一个简单的解释这个问题吗?

4

2 回答 2

4

试试这个:

(mysum (list 1 2 3 a))

这不是范围界定问题,只是对报价的一点误解。当你写这个:

'(1 2 3 a)

你是说:我想要一个包含 elements 的列表1, 2, 3, a。如果必须使用引号,则评估a变量的正确语法是:

`(1 2 3 ,a)
=> '(1 2 3 4.0)

...但在这种情况下,仅使用list构建新列表的过程更简单:

(list 1 2 3 a)
=> '(1 2 3 4.0)

作为记录:您可以轻松地将所有元素添加到列表中,如下所示:

(apply + (list 1 2 3 a))
=> 10
于 2012-10-30T21:44:35.587 回答
2

'(1 2 3 a)是的缩写,(quote (1 2 3 a))表示逐字列表(1 2 3 a)成为 的参数mysum。从未尝试在引号下扩展变量值——如果您在此处写字母,则假定字母是您想要的列表中的内容。特别是第四个元素列表是符号a,而不是名称为该符号的变量的值。

如果你想插入变量的值,你可以list像在另一个答案中那样使用:

(mysum (list 1 2 3 a))

或准:

(mysum `(1 2 3 ,a))
于 2012-10-30T21:48:19.343 回答