0

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

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

我不想转换任何东西。有没有办法将它除以 10,然后如果小数是 0.6 加一?

4

2 回答 2

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))删除数字的最后一位。这就是你应该如何获得下一个要递归的数字。

于 2013-09-15T06:05:03.410 回答
0

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

于 2013-09-15T06:21:28.220 回答