方案高阶函数 - GPA计算器

时间:2015-06-30 21:44:06

标签: list scheme calculator higher-order-functions

我正在尝试用Scheme语言编写GPA计算器。我认为我遇到问题的唯一部分是我需要将字母转换为列表中的整数的部分。我在下面的代码中使用 eq?,因为在他的一个例子中,我们的教授使用了eq?将字母转换为整数。

(define creditSum 
  (lambda (lst)
    (if (or (not (list? lst)) (empty? lst))
        0
        (+ (car lst) (creditSum (cdr lst))))))

(define (gpa lst x)
  (cond
   ((eq? x "A") 4.0)
   ((eq? x "B") 3.0)
   ((eq? x "C") 2.0)
   ((eq? x "D") 1.0)
   ((eq? x "F") 0.0)
   (/ (creditSum x) (length x))))

我想为每个字母分配一个数字,并使用这些字母将输出作为整数或小数。例如,如果我输入:(gpa'(A B A B)),我的输出应为 3.5

1 个答案:

答案 0 :(得分:2)

你是混淆概念。首先,您必须将等级转换为数字,为此您可以使用帮助程序,并注意最好使用符号而不是字符串(更快的比较,更容易编写):

(define (grade->number x)
  (cond
    ((eq? x 'A) 4.0)
    ((eq? x 'B) 3.0)
    ((eq? x 'C) 2.0)
    ((eq? x 'D) 1.0)
    ((eq? x 'F) 0.0)))

现在我们只需要对每个元素应用上述过程,添加它们并找到平均值 - 这是高阶函数发挥作用的部分,看看我们如何使用map:< / p>

(define (gpa lst)
  (/ (creditSum (map grade->number lst))
     (length lst)))

事实上,credit-sum也可以用现有程序表达 - 没有必要重新发明轮子!

(define (creditSum lst)
  (apply + lst))

例如:

(gpa '(A B A B))
=> 3.5