可能な方法は次のとおりです。パラメーターを文字のリストに変換し、パラメーターとして受け取ったにnumber
対応する文字に等しい文字の数を数えます。digit
(define (num-digits number digit)
(let ((n (number->string number))
(d (integer->char (+ (char->integer #\0) digit))))
(count (lambda (x) (char=? x d))
(string->list n))))
上記の手順を別の方法で書くと、短くなりますが読みにくくなります。
(define (num-digits number digit)
(count (curry char=? (integer->char (+ (char->integer #\0) digit)))
(string->list (number->string number))))
さらに別の代替手段は、@ ChrisJester-Young の回答のように算術演算を使用して各桁を順番に処理することですが、数値と桁の両方が正確にゼロであるエッジケースを考慮し、組み込みの再定義を回避します-手順でcount
-これは整数>= 0および基数10でのみ機能することにも注意してください。方法は次のとおりです。
(define (num-digits number digit)
(if (= number digit 0)
1
(let loop ((num number)
(counter 0))
(cond ((zero? num)
counter)
((= digit (remainder num 10))
(loop (quotient num 10) (add1 counter)))
(else
(loop (quotient num 10) counter))))))
上記の文字列ベースのソリューションは少しぎこちないように見えるかもしれませんが、書くのが短く、負の数、10 進数を含む数、10 以外の基数の数などで機能するという追加の利点があります。とにかく、これはどのバージョンでも機能します。
(num-digits 125458563 5)
> 3
そして、これは文字列ベースのバージョンで動作します:
(num-digits -123.1234152 1)
> 3