我需要做一个递归过程,找出一个数字中有多少个6。例如,606有两个6。我开始了。
(define num
(lambda (n)
(cond
((< n 0) (num (- n)))
((= n 0) 0)
((> n 6)
我不想转换任何东西。有没有办法将它除以10,那么如果小数是.6加一个?
答案 0 :(得分:0)
几乎同样好,让我向您介绍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 :(得分:0)
1)对于scheme中的整数除法,使用商函数,如(商9 2)给出的4。 2)对于方案中的整数模数,使用余数函数,因为(余数9 2)给出1。
如你所说,Scheme是基于递归的。要解决递归问题,您必须根据较小的问题实例说明解决方案: “数字N中的6位数是......” 并且......对于N部分的解决方案,你说明了解决方案。
N中最容易重复的部分是N / 10,这是N的最后一位数。然后,为了递归地解决这个问题,你应该假设你知道答案(num(商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,您将获得解决方案。