我发现了一个问题,它说它应该通过使用递归来解决。问题是,给定一定数量,它应该计算其中存在的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,我错过了什么?我不想使用列表或设置!使用辅助变量。有什么帮助吗?
答案 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