2

わかりました、私は前学期にスキームを取りました。1 学期でスキームが上手になることはあり得ないことを知っています。ある数字にある数字が何回出現するかを数えるにはどうすればよいか、友人から尋ねられました。それがリストだった場合の方法を知っています。最初は、組み込みの商または剰余の単純な使用法だと思っていましたが、最終的にはそうではありませんでした。たとえば、数字に 5 が含まれる回数をカウントするにはどうすればよいですか: (numfives 125458563) は 3 を返す必要があります。

Ps: 私は彼のハードウェアを手伝っているわけではありません。自分のためにやっているのです。私は挑戦が好きです。

4

4 に答える 4

3

を使用string->listして、文字列を文字のリストに変換します。次に、リストを作成する場合と同じように進めます。これについては、既に方法を知っていると述べています。(さまざまな書式設定関数を使用して、数値を文字列に変換できます。)

于 2012-09-06T18:34:57.090 に答える
2

私はすべての文字列ベースのソリューションが嫌いです。

私の見解では、それを行うための最良の方法は、各段階で10で割って(そして改造して)各桁を見てから比較することです。例:

(define (count-digit num digit)
  (let loop ((num num)
             (count 0))
    (if (zero? num) count
        (loop (quotient num 10)
              (+ count (if (= digit (remainder num 10)) 1 0))))))
于 2012-09-06T19:47:22.100 に答える
1

可能な方法は次のとおりです。パラメーターを文字のリストに変換し、パラメーターとして受け取ったに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
于 2012-09-06T19:30:43.987 に答える
0

数字をリストに変換するよりも、数字が数字に現れる回数を見つけるよりも。数値をリストに変換するにはこの例を参照してください。

于 2012-09-06T18:34:39.727 に答える