你如何用Scheme计算某个数字的数量?

时间:2013-09-15 05:08:39

标签: recursion scheme

我需要做一个递归过程,找出一个数字中有多少个6。例如,606有两个6。我开始了。

(define num
  (lambda (n)
    (cond
       ((< n 0) (num (- n)))
       ((= n 0) 0)
       ((> n 6)

我不想转换任何东西。有没有办法将它除以10,那么如果小数是.6加一个?

2 个答案:

答案 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,您将获得解决方案。