我正在尝试解决以下问题:
编写一个名为
form-rn
的函数,该函数使用两个Roman-Numeral
个对象(digit1
和digit2
)并生成由两个Roman-Numeral
值表示的两个字符digit1
digit2
和digit1
从左到右阅读。digit2
和(form-rn (make-Roman-numeral "C" 100) (make-Roman-numeral "C" 100))
的字符串值必须是单个字母(I,V,X,L,C,D或M之一)。例如:
(make-Roman-numeral "CC" 200)
生成
(form-rn (make-Roman-numeral "X" 10) (make-Roman-numeral "L" 50))
和(make-Roman-numeral "XL" 40)
生成
(define II (make-Roman-numeral "II" 2)) (define IV (make-Roman-numeral "IV" 4))
。
到目前为止,我尝试了一些事情:
(make-Roman-numeral 'I 1)
(make-Roman-numeral 'V 5)
这是为了产生罗马数字组合,但我意识到这可能不是我应该采取的方法。
(define (form-rn digit1 digit2)
(cond
[(> digit1 digit2) (+ (Roman-numeral-value digit1) (Roman-numeral-value digit2))]))
我想也许如果我必须分别定义每个罗马数字,但它不应该是像“我”那样的单个字符,它应该是像“IV”这样的组合
{{1}}
我考虑过制作条件,因为问题是如果第一个符号比另一个符号大,那么这两个符号会相加,但如果第二个符号大于第一个符号,那么较大符号的值会减去较小的符号。
答案 0 :(得分:0)
你最后一次尝试肯定是在正确的轨道上!几个笔记
Roman-numeral
函数返回form-rn
个对象,因此您需要从其中调用make-Roman-numeral
。digit1
大于digit2
和反向的情况。为了将这些字母组合在一起,我们可以使用string-append
。要查找新的value
,我们可以使用cond
来检查哪个数字更大。然后,我们只需要计算我们计算的两个新值,并将它们组合成一个新的Roman-numeral
对象。
你可以这样做:
(define (form-rn digit1 digit2)
(define new-letters (string-append (Roman-numeral-letters digit1) (Roman-numeral-letters digit2)))
(define new-values
(let ([value1 (Roman-numeral-value digit1)]
[value2 (Roman-numeral-value digit2)])
(cond
[(> value1 value2)
(+ value1 value2)]
[else
(- value2 value1)])))
(make-Roman-numeral new-letters new-values))