Таблица рекурсивного журнала Clojure - PullRequest
0 голосов
/ 29 февраля 2020
(ns logtable) 


(defn displayLogTable[start stop step]
    (if (> start stop) nil
        (if < star stop) log10 start)
        (displayLogTable ( + start step) stop step)
        )
))





(defn -main []
    (println "\n Enter your start, stop and step: ")
        (let 
            [ start stop step (Integer/parseInt (read-line))]
            (print (displayLogTable start stop step)
        )

    )

Я получаю сообщение об ошибке "Слишком много аргументов, если". Я пытаюсь реализовать рекурсивную функцию для распечатки таблицы журнала.

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

Есть несколько ошибок в этой части кода:

(defn displayLogTable[start stop step]
    (if (> start stop) nil
        (if < star stop) log10 start)
        (displayLogTable ( + start step) stop step)
        )
))

Форматирование, чтобы сделать это очевидным:

(defn displayLogTable[start stop step]
  (if (> start stop)
    nil ; 1
    (if <  ;2
      star 
      stop) 
    log10 ; 3
    start) ; 4
  (displayLogTable (+ start step) stop step))
)) ; to much closing parens

if имеет слишком много форм (1-4 ), где разрешено только три (if predicate then else). If в 2 сформирован правильно, но точно не то, что вы хотите (если < истинно (всегда), то star (опечатка, скорее всего start), иначе stop).

0 голосов
/ 03 марта 2020

Если мы исправим ваш код в соответствии с тем, что @ ответ cfrick означает, что мы получим что-то вроде ...

(defn displayLogTable [start stop step]
    (if (> start stop)
      nil
      (if (< start stop)
        (Math/log10 start)
        (displayLogTable (+ start step) stop step))))

Это не имеет особого смысла. Мы можем упростить это до ...

(defn displayLogTable [start stop step]
  (loop [start start]
    (cond 
      (> start stop) nil
      (< start stop) (Math/log10 start)
      :else (recur ( + start step)))))

Столь же бесполезно. Выглядит так, как будто вы хотите последовательность логарифмов диапазона чисел, определенных как start, stop и step. Один из способов сделать это в Clojure - это ...

(defn displayLogTable [start stop step]
  (map
    (fn [x] (Math/log10 x))
    (range start stop step)))

Например, ...

=> (displayLogTable 1 10 1)
(0.0 0.3010299956639812 0.47712125471966244 0.6020599913279624 0.6989700043360189 
 0.7781512503836436 0.8450980400142568 0.9030899869919435 0.9542425094393249)

Обратите внимание, что range включает начальную точку (0 ), но без учета конечной точки (10).

Средства Clojure для работы с последовательностями (здесь встречаются map и range) часто являются ключом к решению подобных проблем.

...