1

自然数 (0、1、2、....など) を消費し、記号 I を使用して単項 (基数 1) で表す文字列を返し、単項の後に数値を 10 進数で表示する関数を設計しています。形。したがって、2 と入力すると、 が得られ"II (2)"ます。5、私は得るだろう"IIIII (5)".

私はこのようにしました:

  (define (number->unary c )
      (cond
       [(= c  1 )  "I (1)" ]
       [(= c  2 ) "II (2)" ]
       [(= c  3) "III (3)"]
       [(= c  4) "IIII (4)"]
       [(= c  5) "IIIII (5)"]
       [(= c  6) "IIIIII (6)"]
       [(= c  7) "IIIIIII (7)"]
       [(= c  8) "IIIIIIII (8)"]
       [(= c  9) "IIIIIIIII (9)"]
       [(= c  10) "IIIIIIIIII (10)"]))

しかし、この問題を解決する簡単な方法はありますか? number->string、string-appends、およびレプリケートについて読んでいますが、どこから始めればよいかわかりません。

4

2 に答える 2

0

実際にはもっと簡単な方法があります - ループを使用して適切な数の"I"文字を生成します。c考えてみてください。が等しい場合はどうなり100ますか? このために何百もの条件を作成する必要はありません。

と呼ばれる再帰的なプロシージャで反復を実装するためのヘルパー プロシージャを使用する方法の 1 つを次に示しますloop

(define (number->unary c)
  (loop c (string-append " (" (number->string c) ")")))

(define (loop num str)
  (if (zero? num)
      str
      (loop (sub1 num) (string-append "I" str))))
于 2013-01-20T17:20:45.320 に答える
0

これは、初心者向け言語で機能します。

以下は、単項部分を生成します。

(define (number->unary c )
  (cond
    [(= c 0) ""]
    [else    (string-append "I" (number->unary (- c 1)))]))

後でカウンターを追加します(括弧が出力に含まれることを意味していますか?)。

于 2013-01-20T17:54:52.143 に答える