我正在自己的How to Design Programs工作。我还没有完全掌握复杂的线性递归,所以我需要一些帮助。
问题:
定义multiply
,它会消耗两个自然数n
和x
,并在不使用Scheme n * x
的情况下生成*
。也可以从此定义中删除+
。
直接使用+号:
(define (multiply n m)
(cond
[(zero? m) 0]
[else (+ n (multiply n (sub1 m)))]))
(= (multiply 3 3) 9)
我知道使用add1
,但我不能正确递归。
感谢。
答案 0 :(得分:6)
将问题分成两个功能。首先,你需要一个函数(add m n)
,它将m加到n。什么是基本情况?当n为零时,返回m。什么是递归步骤?在再次调用add
的结果中添加一个,但递减n。您猜对了,add1
和sub1
会很有用。
另一个函数(mul m n)
类似。什么是基本情况?如果m或n为零,则返回0.递归步骤是什么?将(使用先前定义的函数)m添加到再次调用mul
的结果中,但递减n。就是这样!
答案 1 :(得分:5)
因为这几乎肯定是作业类型的问题,仅提示。
如何添加7和2?虽然大多数人只想出9,但还有更基本的方法吗?
如何增加第一个数字并递减第二个数字,直到其中一个数字达到零?
然后另一个就是答案。我们来试试这个样本:
7 2
8 1
9 0 <- bingo
这对于自然数字可以正常工作,但如果您想要将它应用于底片,则需要小心。您可以了解情况(例如使用10
和-2
),其中两个数字都从零开始。当然,你可以事先检查一下并交换操作。
所以现在你知道可以用递增和递减指令来写+
。这对于递归来说并不是很棒,但是,由于你的递归递增已经遇到了同样的问题,所以它可能是可以接受的。
现在你必须在不使用+
的情况下找出如何在LISP中递增和递减。我想知道是否可能有一些具体的说明: - )