我正在读一篇关于符号计算的温和介绍,它提出了这个问题基本上,前面的内容涉及到用小函数组成更大的函数(类似2-将由两个1-(lisp的减量运算符)组成)
所以问题之一是,定义一个函数的两种不同方法是什么,这个函数返回其输入的一半。我已经能想出明显的一个(除以2),但后来就卡住了。我想从这个数中减去一半,得到一半,但是前一半也必须计算出来…(我不认为作者这么快就打算在书中引入递归,所以我很可能是错的)。
所以我的问题是另一条路是什么只有两种方法吗?
编辑:示例半(5)给出2.5
这本书讲的是LISP的教学,我对此一无所知,但显然有一个特别的倾向,就是用更小的积木来建造更大的积木,所以请尝试用这种方法来回答。
P.P.S-我到目前为止发现了这个,但它的主题完全不同-How to define that float is half of the number?
此处提供书籍的Pdf文件-http://www.cs.cmu.edu/~dst/LispBook/book.pdf(ctrl+f“两种不同的方式”)

最佳答案

好像你在描述peano arithmetic实际上,它的工作方式与使用杯子和桶计算流体的方式相同。
通过将杯从源添加到目标桶,直到源为空乘法和除法只是高级的加法和减法要将源代码减半,需要对两个bucket进行修改,直到源代码为空当然,这要么做ceil要么做floor取决于您选择使用哪个bucket作为答案。

(defun halve (x)
  ;; make an auxillary procedure to do the job
  (labels ((loop (x even acc)
             (if (zerop x)
                 (if even (+ acc 0.5) acc)
                 (loop (- x 1) (not even) (if even (+ acc 1) acc)))))
    ;; use the auxillary procedure
    (loop x nil 0)))

最初我提供了一个Scheme版本(因为您刚刚标记了lisp)
(define (halve x)
  (let loop ((x x) (even #f) (acc 0))
    (if (zero? x)
        (if even (+ acc 0.5) acc)
        (loop (- x 1) (not even) (if even (+ acc 1) acc)))))

关于lisp - 如何定义以两种不同方式返回一半输入的函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20814885/

10-12 12:53