の各桁に1を加える関数は、私が与えた問題です。これ以降、私は今どこにいて、私が作成したコードを説明します。:4桁の整数をとり、以下のスキーム
1.a "digitinc4"は、4桁の整数を入力として受け取り、元の入力整数の桁から構成された別の4桁の整数を返します。それぞれの数字はインクリメントされます。例: (digitinc4 4892)は、5903を返します。入力番号が1000以上であると仮定できます。たとえば、(digitinc4 4833)は5944を返します。数字が9の場合、対応する出力桁は0になります。つまり、先行ゼロはありません。
b。上の問題(a)の答えを拡張して、任意の桁数の入力整数を処理してください。この関数の名前は "digitinc"(名前に "4"は含まれません)とする必要があります。 (digitinc 83)94を返すことになる、と(22897をdigitinc)
+1
+10
+100
+1000
など
によって追加することによって、私は、各桁を増分することができる知っているこれまで33908.
を返す:例えば
assuming input is 4816
1st digit 4816 % 10 = 6 (does not equal 0, increment next digit)
2nd digit 4816/10 = 481.6
481.6 % 10 = 1 (does not equal 0, increment next digit)
3rd digit
481.6/10 = 48.16
48.16 % 10 = 8 (does not equal 0, increment next digit)
4th digit
48.16/10 = 4.816
4.816 % 10 = 4 (does not equal 0, increment next digit)
:例として
以下の結果はまた、私がテストだろう桁に対応する余りであります
そして、私は何かがその数字をインクリメントした後0 をあるかどうかを判断するために、これらの残りを使用することができ、その後、私は次の桁の増分をスキップすることができ
それが9だった場合の数字が0になりますいくつかの特別な状況があります(9 + 1 = 10のため) だから、この数字が0であるかどうかを調べるには、 mod:4816 + 1 >>>> 4817%10を使用して次の数字の加算をスキップすることを知っている等しくないゼロ。これはmodが使われている状況です: 4819 +1 >>>> 4820%10 = 0だから私は今+10をスキップして追加できます100(私は望ましい結果をperfromていない、まだ実行されますいくつかのコードを生成している。最初のcondの最後まで予測されるように すべての作品これに基づいて二回
数字をインクリメントしたくないので。 秒ずつ最初のテストでは、デバッガは2408/5が起きていると言います。 私はここで完全に失われています。私は何度もデバッグしましたが、drracketは洗練されていないので詳細は分かりません。この状況や多分私は私が持っているものを実装する方法より簡単な効率的な方法です。
、ここで以下の私のスキームコードです:
(define (mod x)
(modulo x 10))
(define (di4 n)
(+ n 1) ; increment 1st digit
(cond ;check if 1st digit became 0 if so skip and increment 100 otherwise continue normal
[(= (mod n) 0) (+ n 100)] ;increment 3rd if 2nd is 0
[else (+ n 10)]) ;increment 2nd digit
(cond
[(= (mod (/ n 10)) (+ n 1000))] ;increment 4th if 3rd is 0
[else (+ n 100)]) ;increment 3rd
(cond
[(= (mod (/ n 100) (+ n 10000)))] ;increment 5th if 4th is 0
[else (+ n 1000)]) ;increment 4th
)
数字1とおそらく2を処理して、最初のオーバーフローが発生した場合は2番目の処理を行います。オーバーフローしないようにすると、各桁を別々に処理できるようになります。数字を上げ、オーバーフローせずに増加させ、結果に参加してください。私はSRFI-1 'unfold-right'、' map'、 'fold'を使っていました。 '商 'は整数除算を行います。 – Sylwester