一个消耗小数并在一元中返回的函数

时间:2013-01-20 16:57:25

标签: scheme racket

我正在设计一个消耗自然数(如0,1,2,......等)的函数,并使用符号I返回表示它的字符串(基数1),并显示十进制数字以其一元形式。所以如果我输入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->字符串,字符串附加和重复的内容,但我不知道从哪里开始。

2 个答案:

答案 0 :(得分:0)

确实有一种更简单的方法 - 使用循环生成适当数量的"I"个字符。想一想,如果c等于100,会发生什么?你不应该为此创造一百个条件!

这是一种可能的方法,使用辅助程序通过名为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))))

答案 1 :(得分:0)

这适用于初学者语言。

以下产生一元部分。

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

之后追加计数器(你确定括号 意味着在输出中?)。