我知道这是旧的,但为了将来参考个人发现这个的任何人,我会这样写:
(define (count-digits n acc)
(if (< n 10)
(+ acc 1)
(count-digits (/ n 10) (+ acc 1))))
不同之处在于这个是尾递归的,本质上等同于迭代函数(在内部,Racket 的迭代形式实际上利用了这个事实。)
使用 trace 说明了差异:
(count-digits-taylor 5000000)
>(count-digits-taylor 5000000)
> (count-digits-taylor 500000)
> >(count-digits-taylor 50000)
> > (count-digits-taylor 5000)
> > >(count-digits-taylor 500)
> > > (count-digits-taylor 50)
> > > >(count-digits-taylor 5)
< < < <1
< < < 2
< < <3
< < 4
< <5
< 6
<7
7
(count-digits 5000000 0)
>(count-digits 5000000 0)
>(count-digits 500000 1)
>(count-digits 50000 2)
>(count-digits 5000 3)
>(count-digits 500 4)
>(count-digits 50 5)
>(count-digits 5 6)
<7
7
对于这个练习,这并不重要,但它是一种很好的学习方式。当然,由于原始帖子要求使用一个名为 CountDigits 的函数,它只接受一个参数 (n),您只需添加:
(define (CountDigits n)
(count-digits n 0))