Как я могу преобразовать этот код в Racket / Scheme - PullRequest
0 голосов
/ 30 января 2020

Это код, который я хочу перевести на Racket:

public static ArrayList<Integer> convert(int k, int n) {
        ArrayList<Integer> lst = new ArrayList<>();
        while (k / n != 0) {
            lst.add(k % n); 
            k = k/n;
        }
        lst.add(k % n);
        return lst; 
    }   

Например, в Racket (convert 23 2) должен возвращать двоичный код десятичного числа 23 , то есть (list 1 0 1 1 1).

Это то, что я получил до сих пор:

(define (convert k n)
  (cond 
    [(> (/ k n) 0) (list(modulo k n))]
    [else  0] 
))

Это работает для первого элемента списка.

Спасибо за любую помощь!

1 Ответ

1 голос
/ 30 января 2020

Имейте в виду, что оператор / в Java выполняет целочисленное деление, поэтому в Racket вам придется использовать quotient для получения того же эффекта.

Это хорошая возможность использовать имя let для реализации l oop, поскольку список результатов должен быть накоплен в обратном порядке. Кроме этого, решение довольно простое:

(define (convert k n)
  (let loop ((k k) (acc '()))
    (if (zero? (quotient k n))
        (cons (modulo k n) acc)
        (loop (quotient k n) (cons (modulo k n) acc)))))

Например:

(convert 23 2)
=> '(1 0 1 1 1)
...