Scheme Higher Order Functions - GPA 计算器

Scheme Higher Order Functions - GPA Calculator

我正在尝试用 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.

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

(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 :

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

其实credit-sum也可以用现有的程序来表达,不需要重新造轮子!

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

例如:

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