2016-01-14 2 views
0

Я новичок в Clojure и имею проблемы с моим кодом. Я пытаюсь сделать конвертер чисел. Это мой код:Как преобразовать числа в римские цифры с помощью Clojure?

(defn romanos [numero] 
    (when (and (< numero 40) (>= numero 10)) (print "X") (romanos (- numero 10))) 
    (when (= numero 9) (print "IX") (romanos (- numero 9))) 
    (when (>= numero 5) (print "V") (romanos (- numero 5))) 
    (when (= numero 4) (print "IV") (romanos (- numero 4))) 
    (when (and (<= numero 3) (> numero 0)) (print "I") (romanos (- numero 1))) 
    (when (= numero 0) (print))) 
+0

Привет, Франциско, я отредактировал ваш вопрос, изменил название и теги. Пожалуйста, взгляните на это. Вопросы должны иметь описательные заголовки. Вместо «проблемы с ...», «как это сделать ...» и т. Д. Учитывая время, мы можем видеть, где проблема. Но многие люди могут просто взглянуть быстро и решить не дать времени. Поэтому я бы предложил изменить ваш вопрос, чтобы выяснить, что именно не происходит, что должно произойти. Самый простой способ пояснить - это документировать несколько вызовов, их вывод и ожидаемый результат. Вам не нужно ничего делать. Но если вы это сделаете, вы получите лучшие ответы. Добро пожаловать в SO. – muhuk

+1

'(<9 numero 40)' и '(и ( = numero 10))' - одно и то же. – muhuk

+0

'(когда expr body)' и '(if expr body nil)' - одно и то же. – muhuk

ответ

3

Каждый из ваших when утверждений выполняется в последовательности. 1-8 работают нормально, но цифры больше 8 вызывают условие (>= numero 5) и создают второй рекурсивный вызов.

Ваше окончательное решение должно использовать cond вместо when.

10

Я понимаю, что это, вероятно, будет упражнение, в этом случае это не будет ответ, который вы искали, но ...

(clojure.pprint/cl-format nil "[email protected]" 123) 
;= "CXXIII" 

Для печати на стандартный вывод вместо возврата строки, заменить nil с true; передать в экземпляр java.io.Writer для печати в произвольный поток.

Дополнительную информацию см. В разделе Formatted Output Common Lisp HyperSpec.

0

Я хотел бы предложить, чтобы сохранить карту всех действительных римских значений к их АРАБСКИМ значениям, вычитание высоких один, меньше тому числа в цикле (добавление его римское значения строки результата):

(defn roman [n] 
    (let [alphabet (sort-by val > 
          {\I 1 \V 5 \X 10 \L 50 
          \C 100 \D 500 \M 1000 "IV" 4 
          "IX" 9 "XL" 40 "XC" 90 "CD" 400 
          "CM" 900})] 
    (loop [res "" n n] 
     (if (zero? n) res 
     (let [[rom arab] (some #(when (<= (val %) n) %) alphabet)] 
      (recur (str res rom) (- n arab))))))) 
+0

Thx для всех моих программ работает сейчас: 3 –

Смежные вопросы