我需要做一个递归过程来找出一个数字中有多少个 6。例如,606 有两个 6。我开始了。
(define num
(lambda (n)
(cond
((< n 0) (num (- n)))
((= n 0) 0)
((> n 6)
我不想转换任何东西。有没有办法将它除以 10,然后如果小数是 0.6 加一?
几乎一样好,让我给你介绍一下modulo
。它接受两个数字,并返回第一个除以第二个的余数。取(modulo n 10)
将返回 的最后一位数n
。您想要的一般方案(ba-duh-duh-chiiing)是
(define num-6s
(lambda (n)
(cond
((< n 10)
; Base Case, if n = 6, then 1 else 0
((= (modulo n 10) 6)
; The last digit of n is 6
(else
; The last digit of n isn't 6
))))
现在作为另一个有用的提示,(floor (/ n 10))
删除数字的最后一位。这就是你应该如何获得下一个要递归的数字。
1) 对于 scheme 中的整数除法,使用quotient函数,如 (quotient 9 2) 给出 4。
2) 对于 scheme 中的整数模,使用求余函数,如 (remainder 9 2) 给出 1。
正如您所说,方案基于递归。要解决递归问题,您必须根据问题的较小实例来说明解决方案:“数字 N 中的 6 位数是……”并且对于……您根据N 部分的解。
N 中最容易递归的部分是 N/10,除了 N 的最后一个数字之外。然后,为了递归解决这个问题,您应该假设您知道 (num (quotient N 10)) 的答案。将该值称为 X。知道 N 和 X 如何告诉您 N 中有多少位?
如果 N 的最后一位是 6,则解是 X+1。否则,解为 X。如何判断最后一位是否为 6?使用余数函数。
(define (num N)
; check cases
(cond
; case 1) negative condition
((< N 0) (num (- N)))
; case 2) zero condition, the terminal case
((= N 0) 0)
; case 3) recursive case with a 6 as the last digit
((= (remainder N 10) 6) (+ X 1))
; case 4) recursive case without a 6 as the last digit
(#t X)
))
现在你只需要用递归假设代替 X,例如案例 3 变为
; case 3
((= (remainder N 10) 6) (+ (num (quotient N 10)) 1))
也为案例 4 更改 X,您将得到解决方案。