Создание последовательности всех значений в Clojure - PullRequest
0 голосов
/ 26 ноября 2018

В настоящее время я работаю над вызовом кода ката, и к нему предъявляются следующие требования:

  1. Число u (0) = 1 является первым в вас.
  2. Для каждого x в u, тогда y = 2 * x + 1 и z = 3 * x + 1 тоже должны быть в u.
  3. Других чисел в u нет.

Я построил несколько функций:

(defn test2 [x n orgN] ;;x is a counter, n is what I want returned as a list
  (println n)
  (println "this is x: " x)
  (cons n (if (not= x (- orgN 1 )) 
   (do (test2 (+ x 1) (+ 1 (* n 2)) orgN)
   (test2  (+ x 1) (+ 1 (* n 3)) orgN))
  nil)
))

(defn test2helper [n]
  (def x 1)
  (test2 x x n) 
)


(test2helper 5)

Однако это только возвращает (1 4 13 40) и пропускает целую кучу значений между ними.Минусы - это только создание списка на основе последнего алгоритма 3n + 1, а не сбор других значений, когда я хочу вместо этого последовательность из двух значений, сгенерированных из каждого повторяемого значения n.У меня вопрос, есть ли способ построить последовательность всех значений, а не только 4 из них?

https://www.codewars.com/kata/twice-linear/train/clojure

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Хотя Решение Алана Маллоя отвечает на ваш вопрос, оно не решает проблему, на которую вы ссылаетесь , которая требует, чтобы последовательность генерировалась в возрастающем порядке.

Мой подход заключается в том, чтобы генерировать последовательность лениво по следующей схеме:

(defn recurrence [f inits]
  (map first (iterate f inits)))

Например, вы можете определить последовательность Фибоначчи следующим образом:

(defn fibonacci []
  (recurrence (fn [[a b]] [b (+ a b)]) [1 1]))

=> (take 10 (fibonacci))
(1 1 2 3 5 8 13 21 34 55)

Последовательность, которую вам нужно, сложнее генерировать.Удачной охоты!


0 голосов
/ 28 ноября 2018

Это решение очень близко к правильности.Но помните, что do предназначен для побочных эффектов, а не для получения значений.В частности, (do x y) возвращает y после выполнения побочных эффектов в x.Но test2 не имеет побочных эффектов: он просто возвращает список.Вместо этого вам нужна (concat x y), функция, которая объединяет два списка в один большой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...