我正在设计一个消耗自然数(如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->字符串,字符串附加和重复的内容,但我不知道从哪里开始。
答案 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)))]))
之后追加计数器(你确定括号 意味着在输出中?)。