common-lisp - 口齿不清 : Having Trouble with Conditionals

标签 common-lisp

嘿伙计们,我刚刚开始在大学学习 Lisp,但是教授非常穷,而且他自己似乎也不懂这门语言,所以我向你们求助。我在 Java 方面非常有经验,但在将 Java 的条件与 Lisp 联系起来时遇到了困难。这是我需要解决的问题。

“编写一个函数,计算乘客的年龄和两个城市之间的机票价格。如果 child 不到两岁,则机票价格为 0,二岁到五岁之间,则为全额票价的 60%。如果 child 五岁或以上,他们全额票价。”

这是我的解决方案,有效,但我觉得这效率低下。

(defun young-child(x y)
        (cond
          ((< x 2) 0)
          ((= x 2) (* y .6))
          ((= x 3) (* y .6))
          ((= x 4) (* y .6))
          ((= x 5) (* y .6))
          ((> x 5) y)))

现在在 Java 中我只会说

if (x >= 2 && x =< 5) {
  return y*.6
}
else if (x < 2) {
  return 0;
}
else {
  return y;
}

我要问的是:有没有更好的方法来编写这个 Lisp 条件语句?如果我必须检查更大范围的年龄,那么使用这种方法的代码将变得非常乏味。 Lisp 有没有一种方法可以像我上面在 Java 中那样检查一个 if 语句中的 2 个条件?非常感谢您查看此代码以及 future 的任何回复!

最佳答案

Lisp 有一个 AND可用于组合多个条件的运算符。

(defun young-child (x y)
  (cond ((and (>= x 2) (<= x 5)) (* y .6))
        ((< x 2) 0)
        (t y)))

您还可以通过单个函数调用 (<= 2 x 5) 来完成此操作或(>= 5 x 2)测试是否 x介于2之间和5包容性。

但是如果你测试(< x 2)首先,您不需要测试是否 (>= x 2)之后,因为条件是按照给定的顺序进行测试的。

(defun young-child (x y)
  (cond ((< x 2) 0)
        ((<= x 5) (* y .6))
        (t y)))

关于common-lisp - 口齿不清 : Having Trouble with Conditionals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34886401/

相关文章:

loops - 从循环内的格式返回

common-lisp - sbcl 在优化时是否考虑函数是否有副作用?

file - 如何在 Common Lisp 中进行批量文件编辑?

common-lisp - Common Lisp 中的条件 Windows 注释

reflection - 符号函数的反义词是什么?

function - 在 Common Lisp 中将函数转换为字符串或符号

lisp - 将列表列表的元素定义为普通 lisp 中的新变量

lisp - 谁能给我一些关于这个问题(家谱)的提示?

common-lisp - 在Common Lisp中,什么时候需要用到eval-when,又是怎么知道的呢?

common-lisp - 我可以在受限环境中执行不受信任的 Common Lisp 代码吗?