【发布时间】:2019-06-11 13:29:01
【问题描述】:
我在大学,一年级编程,到目前为止一切顺利,然后我坚持这个练习,我必须做一个函数:
function(n1 n2) = n1 * n2
但不使用 * 运算符。
我们可以使用的是前面两个数字相加的函数。
;Takes two numbers as input and return the sum between them
;Number Number -> Number
;(sum 2 3) = 5
(define (sum n1 n2)
(cond
[(zero? n1) n2]
[(positive? n1) (sum (sub1 n1) (add1 n2))]
))
不要使用 + 或 * 的诀窍是我们必须使用递归函数。
这就是我所做的,这个函数必须返回两个数字的乘积,所以我们知道乘法 3 * 2 是 3 + 3 或 2 + 2 + 2,所以这就是我在这里尝试做的但我想不出来更多
;Takes two numbers as input and return the multiplication between them
;Number Number -> Number
;(mult 3 2) = 6
(define (mult n1 n2)
(cond
[(zero? n1) n2]
[(positive? n1) (mult (sub1 n1) (sum n1 n2))]
))
(mult 3 2) 的输出是 8,这显然不是我需要做的。
解决了!
(define (mult n1 n2)
(cond
[(or (zero? n1) (zero? n2)) 0] ;verify if zero is one of the inputs and return it
[(eq? 1 n1) n2] ;if n1 is one return n2
[(eq? 1 n2) n1] ;if n2 is one return n1
[(positive? n1) (sum n2 (mult (sub1 n1) n2))] ;if it none of the adove, add n2 n1Times to itself
))
谢谢! @Barmar @coredump
【问题讨论】:
-
你确定
[(zero? n1) n2]?你认为(mult 0 2)的结果是 2 吗? -
哈哈我现在觉得很愚蠢,因为没看到
-
不过,这是一个很好的教训。当递归函数的行为不符合预期时,首先要检查的事情之一是基本案例是否真的有意义。
-
你的递归步骤也不对。
(mult 4 5)和(mult 3 6)不一样。 -
替代方案是
(mult 4 5) == (sum 5 (mult 3 5)) == (sum 5 (sum 5 (mult 2 5))) ...
标签: recursion scheme lisp racket