【问题标题】:Scheme Higher Order Functions - GPA Calculator方案高阶函数 - GPA 计算器
【发布时间】:2015-06-30 21:44:05
【问题描述】:

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

【问题讨论】:

  • "eq?"可能不是用于字符串的正确比较。 (eq? "a" "a") 不一定是真的。相反,您需要使用equal?
  • eq?不将字母转换为整数。情商?是一种等价关系,您可以在the documentation 中了解更多信息。您的教授可能犯了一个错误,或者您可能误解了您的教授,但是 eq?不将字母转换为整数。
  • (eq? x "D") 中,您正在比较一个字符串和一个变量x 的值。当您编写'(A B A B) 时,您有一个符号列表(不是字符串!),因此x 的值将是一个符号。没有符号会等于字符串。
  • 那么有没有内置函数可以用来将符号转换为整数?

标签: list scheme calculator higher-order-functions


【解决方案1】:

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

(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

【讨论】:

  • 不错的答案。使用符号代替字符串会更好,因此您可以使用(gpa '(A B C)) 而不是(gpa '("A" "B" "C"))。具有能够使用eq? 进行比较的优势(打字更快更容易!)
  • @Jay 这是一个很好的建议,我尝试遵循 OP 的尝试解决方案,但最好向他/她展示在 Scheme 中做事的首选方式。我编辑了我的答案:)
  • 非常感谢!!!我已经为这个问题苦苦挣扎了好几个小时。现在我明白它是如何工作的了!现在真的很有意义。我一直坚持将字母转换为数字。我也喜欢你如何为 creditSum 制作一个简短而漂亮的程序!当我把它和我的比较时......!大声笑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多