Scheme - 如何将数据结构应用于组合2个罗马数字对象(字母和值)以生成2个字符的罗马数字?

时间:2015-02-09 06:16:35

标签: data-structures scheme racket

我正在尝试解决以下问题:

  

编写一个名为form-rn的函数,该函数使用两个Roman-Numeral个对象(digit1digit2)并生成由两个Roman-Numeral值表示的两个字符digit1 digit2digit1从左到右阅读。 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}}

我考虑过制作条件,因为问题是如果第一个符号比另一个符号大,那么这两个符号会相加,但如果第二个符号大于第一个符号,那么较大符号的值会减去较小的符号。

1 个答案:

答案 0 :(得分:0)

你最后一次尝试肯定是在正确的轨道上!几个笔记

  1. 问题要求您从Roman-numeral函数返回form-rn个对象,因此您需要从其中调用make-Roman-numeral
  2. 您需要分别处理digit1大于digit2和反向的情况。
  3. 为了将这些字母组合在一起,我们可以使用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))