Ракетка простая процедура преобразования числа из базы 10 в базу 4

У меня проблемы с ракеткой. Задание требует, чтобы я написал процедуру, которая преобразует любое число из базы 10 в базу 4, решение должно быть записано в виде списка. например (convert-to-base-four 12) -> (list 3 0) Теперь я написал процедуру, но она вставляет каждое число в отдельный список. вот мой код.

(define (convert-to-base-four number)
  (cond
    [(<= number 3) (cons number empty)] 
    [(> number 3)  (reverse (list (remainder number 4)
                    (convert-to-base-four (floor (/ number 4)))))]))

Кто-нибудь знает что делать? Большое спасибо


person stuck_in_racket    schedule 23.11.2017    source источник
comment
Вы используете list, когда должны использовать cons. Также цифры будут перемешаны в неправильном порядке из-за множественных reverse вызовов на разных рекурсивных шагах.   -  person Alex Knauth    schedule 23.11.2017
comment
проблема в том, что если я скомбинирую список и переверну его, то получится облажаться. Это проблема парантеза?   -  person stuck_in_racket    schedule 23.11.2017
comment
Нет, это не проблема родителей. Ваше дерево в порядке. В основном это проблема list против cons. Затем, как только это будет решено, вы должны выяснить, следует ли использовать реверс таким образом или нет.   -  person Alex Knauth    schedule 23.11.2017
comment
другими словами, когда я использую список, мне не нужно обратное, но числа помещаются индивидуально в списки, например (список (список 3) 0)   -  person stuck_in_racket    schedule 23.11.2017
comment
Да, я знаю. Но подумайте о сигнатуре этой функции. Я предполагаю, что он должен вернуть список цифр. Теперь подумайте о подписи list. Для заданных X и X он возвращает список X. Но у вас нет X и X, у вас есть цифра и список цифр, и вы хотите, чтобы он возвращал список цифр. Вы нарушаете подпись list. Здесь неправильно использовать.   -  person Alex Knauth    schedule 23.11.2017
comment
хорошо, я использовал добавление, и это сработало. Большое спасибо за твои усилия, мой друг.   -  person stuck_in_racket    schedule 23.11.2017
comment
@stuck_in_racket, см. мой ответ - append обычно неправильное решение для ракетки - используйте его только при необходимости   -  person Mulan    schedule 23.11.2017


Ответы (2)


Комментарий AlexKnauth - это тот комментарий, которому вы должны следовать - вы должны определить и придерживаться строгого домена (ввод) и codomain (вывод) для вашей функции

;; from your code
(list Y
      (convert-to-base-four X))

Неважно, что здесь Y и X: если convert-to-base-four возвращает список некоторого значения и рекурсивный вызов convert-to-base-four, который возвращает список, вы получите список списки!

Одно из решений, как указывает другой, - использовать append, но будьте осторожны, это ловушка

(define (base4 n)
  (if (< n 4)
      (list n)
      (append (base4 (floor (/ n 4)))
              (list (remainder n 4)))))

(displayln (base4 12))     ; (3 0)
(displayln (base4 13))     ; (3 1)
(displayln (base4 14))     ; (3 2)
(displayln (base4 15))     ; (3 3)
(displayln (base4 16))     ; (1 0 0)
(displayln (base4 123456)) ; (1 3 2 0 2 1 0 0 0)

Лучшее решение могло бы избежать дорогостоящего использования append - здесь мы делаем это с помощью с именем let loop с двумя переменными состояния цикла m и acc

(define (base4 n)
  (let loop ((m n) (acc empty))
    (if (< m 4)
        (cons m acc)
        (loop (floor (/ m 4))
              (cons (remainder m 4) acc)))))

(displayln (base4 12))     ; (3 0)
(displayln (base4 13))     ; (3 1)
(displayln (base4 14))     ; (3 2)
(displayln (base4 15))     ; (3 3)
(displayln (base4 16))     ; (1 0 0)
(displayln (base4 123456)) ; (1 3 2 0 2 1 0 0 0)
person Mulan    schedule 23.11.2017
comment
большое спасибо за ваш ответ. Я понимаю вашу точку зрения. Еще раз большое спасибо - person stuck_in_racket; 24.11.2017

Попробуйте добавить в свой список :)

Удачи с домашним заданием;)

person Plattenfotograf    schedule 23.11.2017
comment
Это не ответ! Пожалуйста, прочтите это, прежде чем вносить свой вклад: stackoverflow.com/help/how-to-answer - person hmofrad; 23.11.2017