乘以无+或*

时间:2011-11-25 14:27:12

标签: recursion lisp scheme racket

我正在自己的How to Design Programs工作。我还没有完全掌握复杂的线性递归,所以我需要一些帮助。

问题: 定义multiply,它会消耗两个自然数nx,并在不使用Scheme n * x的情况下生成*。也可以从此定义中删除+

直接使用+号:

(define (multiply n m)
  (cond
    [(zero? m) 0]
    [else (+ n (multiply n (sub1 m)))]))

(= (multiply 3 3) 9)

我知道使用add1,但我不能正确递归。

感谢。

2 个答案:

答案 0 :(得分:6)

将问题分成两个功能。首先,你需要一个函数(add m n),它将m加到n。什么是基本情况?当n为零时,返回m。什么是递归步骤?在再次调用add的结果中添加一个,但递减n。您猜对了,add1sub1会很有用。

另一个函数(mul m n)类似。什么是基本情况?如果m或n为零,则返回0.递归步骤是什么?将(使用先前定义的函数)m添加到再次调用mul的结果中,但递减n。就是这样!

答案 1 :(得分:5)

因为这几乎肯定是作业类型的问题,仅提示。

如何添加7和2?虽然大多数人只想出9,但还有更基本的方法吗?

如何增加第一个数字并递减第二个数字,直到其中一个数字达到零?

然后另一个就是答案。我们来试试这个样本:

7 2
8 1
9 0 <- bingo

这对于自然数字可以正常工作,但如果您想要将它应用于底片,则需要小心。您可以了解情况(例如使用10-2),其中两个数字都从零开始。当然,你可以事先检查一下并交换操作。

所以现在你知道可以用递增和递减指令来写+。这对于递归来说并不是很棒,但是,由于你的递归递增已经遇到了同样的问题,所以它可能是可以接受的。

现在你必须在不使用+的情况下找出如何在LISP中递增和递减。我想知道是否可能有一些具体的说明: - )