2016-10-28 7 views
0

の各桁に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 
) 
+0

数字1とおそらく2を処理して、最初のオーバーフローが発生した場合は2番目の処理を行います。オーバーフローしないようにすると、各桁を別々に処理できるようになります。数字を上げ、オーバーフローせずに増加させ、結果に参加してください。私はSRFI-1 'unfold-right'、' map'、 'fold'を使っていました。 '商 'は整数除算を行います。 – Sylwester

答えて

1

あなたはいくつかの基本的なスキームのプログラミングを確認する必要があります - 関数の結果は、その本体の最後の式の値であり、さらには、いずれも変更しません。そのオペランドの

また、整数に適用される/は、整数除算ではなく、(切り捨て)整数除算を実行します。結果は整数ではなく小数です。
quotientを使用してください。

あなたは分裂を固定した場合でも、(di4 4819)はこれを行うだろう:+ 1 = 4820コンピュート4819

  • とは、結果を破棄し、その後、+ 10 = 4829と結果を破棄計算4819
  • を計算して4819 + 100 = 4919とし、結果を破棄した場合は、
  • を計算して4819 + 1000 = 5819を返します。

あなたは全体の代わりに、整数の桁数のコレクションを操作する問題に変換する場合、この運動は簡単です:

  1. 桁に入力整数を分解します。
  2. ルールを各桁に個別に適用します。
  3. 数字を整数に再構成します。

このような何か:

; The rule for incrementing one digit. 
(define (inc-digit n) 
    (modulo (+ n 1) 10)) 

; Assemble four digits into an integer. 
(define (make-int4 a b c d) 
    (+ (* a 1000) (* b 100) (* c 10) d)) 

; Increment four digits and assemble into an integer. 
(define (make-inc4 a b c d) 
    (make-int4 (inc-digit a) (inc-digit b) (inc-digit c) (inc-digit d))) 

; Shorthand 
(define (mod10 x) 
    (modulo x 10)) 

; Disassemble the input, then reassemble it. 
(define (di4 n) 
    (make-inc4 (mod10 (quotient n 1000)) 
      (mod10 (quotient n 100)) 
      (mod10 (quotient n 10)) 
      (mod10 n))) 

一般化は、同じ一般的なパターンに従うが、リストを使用します。リストの再帰と最近map関数について学んだことがあります。

関連する問題