Clojure: функция dosq для печати диапазона чисел сверху вниз - PullRequest
0 голосов
/ 21 декабря 2018

Я пишу назначение в Clojure, которое должно отображать список простых чисел между 2 входами: from и to.Мне удалось сделать это с помощью этой функции:

(defn print-top-primes [ from to ]
  (doseq
    [ i (prime-seq from to) ]   ;;prime-seq returns a range of numbers
    (println i)
  )
)

, которая дает вывод:

 (print-top-primes 50 100)   
53
59
61
67
71
73
79
83
89
97
=> nil

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

 (print-top-primes 50 100)
97
89
83
79
73
71
67
61
59
53
Total=732
=> nil

Мне не удается использовать doseq для печати чисел сверху вниз.

Мне также нужно добавить сумму всех простых чисел, но я не уверен, как это будет работатьпоскольку функция doseq не содержит каждое значение i.

Возможно, я использую неправильную функцию, однако пример в назначении выдает:

=> nil

..предположить, что это doseq функция?

Любая помощь будет принята с благодарностью.

Спасибо

Ответы [ 3 ]

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

Спасибо, Джас,

Просмотр вашего ответа помог мне придумать еще более простой способ, я думаю, это то, как меня учили, поэтому я, вероятно, должен реализовать его следующим образом:

(defn print-top-primes [ from to ]
  (doseq [i (reverse (prime-seq from to))]
    (println i))
  (printf "Total = %d\n" (reduce + (prime-seq from to)))
)

Правильный вывод!

Мне интересно, есть ли способ просто вывести первые 10 наибольших простых чисел, учитывая большое число простых чисел?

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

Возможно, ваш курс упомянет об этом дальше, но в любом случае я бы не использовал здесь doseq, но loop и recur:

(loop [elements (reverse (range 10))
       sum 0]
  (if (empty? elements)
    sum
    (let [[head & tail] elements]
      (println head)
      (recur tail (+ sum head)))))

Отпечатки:

9
8
7
6
5
4
3
2
1
0

Возвращает:

45

Вместо того, чтобы возвращать значение, вы можете легко написать необходимую строку Total и вернуть ноль.

Макрос loop позволяет определить аккумуляторы(как sum).Я использую нотацию [head & tail], чтобы разрушить последовательность элементов в двух частях.Обращенная последовательность пересматривается только один раз.

[возвращает ноль] ... предполагая, что это функция dosq?

Во-первых, doseq - это макрос,и во-вторых, существует так много способов вернуть nil, что вы не сможете угадать, использует ли ваш пример doseq или нет.Должно ли вы использовать doseq или нет, должно быть указано в задании, возможно, вы не обязаны его использовать.

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

Один простой способ будет выглядеть так:

(defn print-top-primes [from to]
  (let [top-primes (reverse (prime-seq from to))
        total (apply + top-primes)]
    (doseq [i top-primes]
      (println i))
    (printf "Total = %d\n" total)))

=> (print-top-primes 50 100)
97
89
83
79
73
71
67
61
59
53
Total = 732
nil

Если вы действительно хотите избежать трех проходов по списку простых чисел (один для reverse, один для apply + и один для печати), вы можете попробовать что-то вроде:

(defn print-top-primes [from to]
  (loop [primes (prime-seq from to)
         total 0]
    (let [p (last primes)]
      (if p
        (do (println p)
            (recur (butlast primes) (+ total p)))
        (printf "Total = %d\n" total)))))

Но вы хотели бы убедиться, что этого достаточно для повышения производительности, чтобы оправдать увеличение сложности.

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