计算数字出现次数的递归

时间:2016-05-01 22:30:51

标签: recursion scheme

我发现了一个问题,它说它应该通过使用递归来解决。问题是,给定一定数量,它应该计算其中存在的8个数,但如果两个8彼此相邻则应计为双数。例如:

  48 should return 1
  4881 should return 4
  8818 should return 5

我在Scheme中制作了以下程序:

(define (count n)
  (if (= n 0)
      0
      (begin
        (if (= (remainder n 100) 88)
            2
            (begin
              (if (= (remainder n 10) 8) 
                   1
                   0))
            )
        (+ (count (quotient n 10))))))

问题是每次我运行它都会返回0,我错过了什么?我不想使用列表或设置!使用辅助变量。有什么帮助吗?

2 个答案:

答案 0 :(得分:1)

每当你找到匹配项时,你必须继续迭代,而且总和看起来并不合适。此外,不是嵌套",而是使用if更好,如下所示:

cond

它适用于您的示例:

(define (count n)
  (cond ((= n 0) 0)
        ((= (remainder n 100) 88)
         (+ 4 (count (quotient n 100))))
        ((= (remainder n 10) 8)
         (+ 1 (count (quotient n 10))))
        (else
         (+ (count (quotient n 10))))))

答案 1 :(得分:0)

最好在帮助器中计算8s的扫描并保持当前的命中数和先前扫描的总计数。

(define (funny-eights n)
  (define (aux n cur total)
    (cond ((= (remainder n 10) 8)
           (aux (quotient n 10) (+ cur 1) total))
          ((> cur 1)
           (aux (quotient n 10) 0 (+ total (* 2 cur))))
          ((= cur 1)
           (aux (quotient n 10) 0 (+ total cur)))
          ((> n 0)
           (aux (quotient n 10) 0 total))
          (else
           total)))
  (aux n 0 0))

(funny-eights 488838288) ; ==> 11  or 3*2 + 1 + 2*2