Common Lisp - 符号计算的简要介绍:练习 4.4
Common Lisp - Gentle introduction to symbolic computation: Excercise 4.4
我正在使用 clisp 学习 Common Lisp 并输入了以下代码:
(defun ordered (x y)
(if (< x y)
(list x y)
(list y x)))
(setq l (ordered 28 49))
(print l)
(setq l (ordered 49 28))
(print l)
期待这些答案:
(28 49)
(49 28)
得到这些答案:
(28 49)
(28 49)
在本书的解答中我发现了相同的函数定义。
有什么问题吗?
您的代码
(defun
定义一个函数,
ordered
名为 "ordered",
(x y)
期望两个参数在其 主体 中被称为 "x" 和 "y",因此在收到参数时(即被调用两个值,例如 (ordered 49 28)
)
(if (< x y)
它将比较它们,如果第一个小于第二个,它将产生
(list x y)
相同的两个值重新打包在一个列表中(即'(49 28)
); 或否则,如果第一个值不小于第二个,
(list y x)))
它将生成包含第二个值的列表第一个,然后是第一个参数值(即'(28 49)
)。
所以,这里是比较 49 和 28 的情况?
一般阅读这段代码,我们可以说如果它接收到 更小的 数字作为它的 第一个 参数,它会产生更小的结果列表中的数字在前,较大的数字在后;
如果它接收到 smaller 数字作为其 second 参数,它将首先产生较小的数字,然后产生较大的数字, 在结果列表中。
回头读一遍,我们可以看到这个描述可以进一步简化为一个简单的语句:在结果列表中,它总是首先生成 ______ 个数字,然后生成 ______ 个数字。
解决这个问题的另一种方法是写下该定义创建的函数,
( lambda (x y) (if (< x y) (list x y) (list y x) ) )
然后象征性地跟随它的应用:
( ( lambda (x y) (if (< x y) (list x y) (list y x) ) )
49
28 )
==
(let ( (x 49)
(y 28)
)
(if (< x y) (list x y) (list y x) ) )
==
(let ( (x 49)
(y 28)
)
(if (< 49 28) (list x y) (list y x) ) )
==
(let ( (x 49)
(y 28)
)
(if FALSE (list x y) (list y x) ) )
==
(let ( (x 49)
(y 28)
)
(list y x) )
==
(let ( (x 49)
(y 28)
)
(list 28 49) )
==
(list 28 49)
我正在使用 clisp 学习 Common Lisp 并输入了以下代码:
(defun ordered (x y)
(if (< x y)
(list x y)
(list y x)))
(setq l (ordered 28 49))
(print l)
(setq l (ordered 49 28))
(print l)
期待这些答案: (28 49) (49 28)
得到这些答案: (28 49) (28 49)
在本书的解答中我发现了相同的函数定义。 有什么问题吗?
您的代码
(defun
定义一个函数,
ordered
名为 "ordered",
(x y)
期望两个参数在其 主体 中被称为 "x" 和 "y",因此在收到参数时(即被调用两个值,例如 (ordered 49 28)
)
(if (< x y)
它将比较它们,如果第一个小于第二个,它将产生
(list x y)
相同的两个值重新打包在一个列表中(即'(49 28)
); 或否则,如果第一个值不小于第二个,
(list y x)))
它将生成包含第二个值的列表第一个,然后是第一个参数值(即'(28 49)
)。
所以,这里是比较 49 和 28 的情况?
一般阅读这段代码,我们可以说如果它接收到 更小的 数字作为它的 第一个 参数,它会产生更小的结果列表中的数字在前,较大的数字在后;
如果它接收到 smaller 数字作为其 second 参数,它将首先产生较小的数字,然后产生较大的数字, 在结果列表中。
回头读一遍,我们可以看到这个描述可以进一步简化为一个简单的语句:在结果列表中,它总是首先生成 ______ 个数字,然后生成 ______ 个数字。
解决这个问题的另一种方法是写下该定义创建的函数,
( lambda (x y) (if (< x y) (list x y) (list y x) ) )
然后象征性地跟随它的应用:
( ( lambda (x y) (if (< x y) (list x y) (list y x) ) )
49
28 )
==
(let ( (x 49)
(y 28)
)
(if (< x y) (list x y) (list y x) ) )
==
(let ( (x 49)
(y 28)
)
(if (< 49 28) (list x y) (list y x) ) )
==
(let ( (x 49)
(y 28)
)
(if FALSE (list x y) (list y x) ) )
==
(let ( (x 49)
(y 28)
)
(list y x) )
==
(let ( (x 49)
(y 28)
)
(list 28 49) )
==
(list 28 49)