我试图解决以下问题:
编写一个名为
form-rn的函数,它消耗两个Roman-Numeral对象(digit1和digit2),并生成由digit1和digit2从左到右读取的值所表示的双字符Roman-Numeral。digit1和digit2的字符串值必须是单个字母( I、V、X、L、C、D或M之一)。 例如: (表格-rn(作罗马数字"C“100) (作罗马数字"C”100)) 生成(make-Roman-numeral "CC" 200),并且 (表格-rn(作罗马数字"X“10) (作罗马数字"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)我想,如果我必须分别定义每个罗马数字,但它不应该是像"I“这样的单个字符,而是应该是像"IV”这样的组合。
(define (form-rn digit1 digit2)
(cond
[(> digit1 digit2) (+ (Roman-numeral-value digit1) (Roman-numeral-value digit2))]))我考虑了一些条件,因为问题是,如果第一个符号比另一个符号大,那么两个符号加起来,但是如果第二个符号大于第一个符号,那么较大符号的值减去较小符号的值。
发布于 2015-02-09 06:46:10
你的最后一次尝试绝对在正确的轨道上!几个音符
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))https://stackoverflow.com/questions/28403849
复制相似问题