Lisp:遇到条件问题

Xul*_*luu 2 common-lisp

嘿伙计们,我刚刚开始在我的大学里学习Lisp,但教授非常贫穷,而且自己似乎不懂语言,所以我转向你们所有人.我在Java方面非常有经验,并且在将Java的条件与Lisp相关时遇到了麻烦.这是我被要求解决的问题.

"写一个函数,它接受乘客和两个城市之间的机票量的年龄.如果孩子小于两个机票为0,二至五它是全票价的60%.如果孩子为五他们全程票价."

这是我的解决方案,但我认为这是低效的.

(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)))
Run Code Online (Sandbox Code Playgroud)

现在用Java,我就是这样说的

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

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

Bar*_*mar 6

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

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

你也可以用一个函数调用做(<= 2 x 5)(>= 5 x 2)以测试是否x是间25包容性.

但是如果你(< x 2)先测试,那么(>= x 2)在那之后你就不需要测试,因为条件是按照给定的顺序测试的.

(defun young-child (x y)
  (cond ((< x 2) 0)
        ((<= x 5) (* y .6))
        (t y)))
Run Code Online (Sandbox Code Playgroud)