【问题标题】:multiplication of empty list in emacs lispemacs lisp中空列表的乘法
【发布时间】:2012-01-24 11:28:00
【问题描述】:

为什么在像(*) 这样的lisp(Emacs Lisp 和Scheme)构造中返回1

我在这里乘什么?如何在不带参数的情况下调用此函数*

【问题讨论】:

    标签: emacs lisp scheme


    【解决方案1】:

    这是一个数学约定:根据定义,product of an empty sequence of numbers 是一个;请注意,一个是乘法的单位元 (1×a = a×1 = a)。这很方便,因为您可以使用可变数量的参数调用*,而不必担心没有参数存在的情况。

    同样,一个空的数字序列之和为零,是加法的单位元素。尝试在 Lisp 提示符下发出 (+)

    【讨论】:

    • (*(+(*)(*)(*))(+(*)(*)(*)(*)(*)(*))(+(*)(*(+(*)(*)(*)(*))(+(*)(*)(*))(+(*)(*)(*)))))
    • @EliBarzilay: 那是野兽的性别吗?
    • (是的,还有最小长度的版本……)
    【解决方案2】:

    这是从数学继承而来的属性。就像加法,你可以将任意数量的数字相加,特殊情况是没有数字相加得到和为零。

    同样对于乘法,如果您将任意数量的数字相乘,您将得到乘积。为了让它在没有数字的情况下工作,使用 1 作为基值(它在数学中有一些花哨的名字,我多年前已经忘记了)。

    那么,您在编程语言中有什么实际用途吗?是的,因为您可以使用任意数量的参数调用像 +* 这样的函数,我会说是的。例如:

    (apply '+ '(2 3 4)) => 9
    (apply '+ '(2 3))   => 5
    (apply '+ '(2))     => 2
    (apply '+ '())      => 0
    
    (apply '* '(2 3 4)) => 24
    (apply '* '(2 3))   => 6
    (apply '* '(2))     => 2
    (apply '* '())      => 1
    

    【讨论】:

    • 注意:在Scheme中,您必须删除运算符前面的'(即quote)才能运行示例。例如,(apply + '()) 而不是 (apply '+ '())
    猜你喜欢
    • 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
    相关资源
    最近更新 更多