公共lisp中n的问题

公共lisp中n的问题,lisp,common-lisp,clisp,Lisp,Common Lisp,Clisp,我想写一个函数,可以计算GPA。现在我只能做3次有限的计算,但我坚持要做更多的计算,而不使用循环或递归——这是主题的要求——如何扩展第n个函数?比如:n,如果是的话,这意味着我需要写一个lambda表达式吗?作为一个新手,我可能无法清楚地描述这个问题,真的需要一些帮助 Glist是分数Clist是学时 GPA=成绩点*积分小时数+成绩点*积分小时数/积分小时数之和,如:3*1+3*2+4*1/1+2+1 这是我的密码: (defun gpa (Glist Clist) (format

我想写一个函数,可以计算GPA。现在我只能做3次有限的计算,但我坚持要做更多的计算,而不使用循环或递归——这是主题的要求——如何扩展第n个函数?比如:n,如果是的话,这意味着我需要写一个lambda表达式吗?作为一个新手,我可能无法清楚地描述这个问题,真的需要一些帮助

Glist是分数Clist是学时

GPA=成绩点*积分小时数+成绩点*积分小时数/积分小时数之和,如:3*1+3*2+4*1/1+2+1

这是我的密码:

(defun gpa (Glist Clist)
     (format t "~3,2f~%" 
      (/ 
        (+(nth 0 (mapcar #' * Glist Clist))
          (nth 1 (mapcar #' * Glist Clist))
          (nth 2 (mapcar #' * Glist Clist)))
        (+ (nth 0 Clist)
           (nth 1 Clist)
           (nth 2 Clist))
                   );end "/"
                   );end "format" 
       (values)    );end 
如果您使用nth遍历列表,则说明您做错了。在这种情况下,您可能需要编写求和函数:

(defun sum (items)
  (reduce #'+ items))
编辑

这似乎是一个很好的机会来强调一些常见的c Lisp小概念,所以我充实了我的答案来说明

如另一个答案中所述,您可以使用对数字列表进行操作的求和函数:

(defun sum (nums)
  (reduce #'+ nums))
点积是两个等长向量的乘积和:

(defun dot-product (x y)
  (sum (mapcar #'* x y)))
gpa功能是两个功能的简单组合:

(defun gpa (grades credits)
  (/ (dot-product grades credits) (sum credits)))
问题中的示例得出了我们希望减号格式为浮点的答案:

(gpa '(3 3 4) '(1 2 1))
> 13/4
从这个例子中,有几件事值得一提:

您应该了解,以及它们的变体和亲属。这些函数对于Lisp非常重要,对于在列表上操作非常有用。map*函数通常将序列映射到序列,而reduce通常将序列转换为单个值。不过,您可以使用reduce'cons'1 2 3等形式

这是自下而上编程方法的一个很好的例子;通过编程像sum这样的简单函数,您可以很容易地在上面写点积。现在,gpa函数是在其他两个函数之上构建的一个简单、可读的函数。这些都是一行代码,任何对CL有基本了解的人都可以轻松阅读。这与通常应用于OOP的方法形成对比

代码没有重复。当然,sum被多次使用,但只在有意义的地方使用。对于抽象列表元素和的概念,您可以做的事情很少。在Scheme中,用函数编写函数更为自然,这是一个完全不同的主题。这是一个简单的例子,但没有两个函数做相同的事情


@雷纳:谢谢!更新。我实际上是一个阴谋家,所以我有时不知道在CL中做事情的更好的方法。不过,在Scheme中,我也会使用reduce,它使用不同于CL版本的参数,所以。哦,这真的很简单。为什么我没有找到这个函数。。无论如何,谢谢你的帮助。我必须更仔细地阅读..+1非常好的自下而上的方法解释。我写了一个类似的答案,虽然没有那么雄辩;-,对于方案,最近:是的,结论是减少或折叠方案是一项非常重要的操作:-DAh,我不认为我知道如何在CL中进行foldr…通过我自己的链接,我找到了它,这就是我想在上面使用的示例:reduce'cons:initial value':from end t==>。[这]巧妙地展示了这是列表上的标识函数,它只是在CL中有笨拙的语法。@Chris谢谢你的链接,我不经常使用Lisps,这很有启发性。使用标准缩进,不要重复代码来注释括号我的意思是,到底是什么?。例如,见: