Рекурсивная функция в Clojure не соответствует утверждению - PullRequest
1 голос
/ 07 ноября 2011

Следующее является рекурсивной функцией:

(defn make-control-data [it  alphabet] 
  {:pre [(integer? it) (pos? it)]}
  (let [shuffled-alphabet-string (reduce str (shuffle alphabet))] 
   (if (zero? it) 
       shuffled-alphabet-string  
       (str shuffled-alphabet-string (make-control-data (dec it) alphabet)))))

Должно быть целое число (it), которое указывает число рекурсивных вызовов и список строк, например, ["a" "b"]. Он должен возвращать произвольно упорядоченную строку длиной it*length(alphabet), используя все буквы алфавита. Если it = 2 и алфавит = ["a" "b"], функция должна выдать случайную строку длины (* 2 (count ["a" "b"])) = 4, используя все буквы алфавита ["a" "b"]

Прерывает предварительное условие (pos? it) и возвращает строку длины (it+1)*length(alphabet).

Кто-нибудь может увидеть, что не так?

Ответы [ 2 ]

2 голосов
/ 07 ноября 2011

Ваша функция, очевидно, готова принять it = 0, поэтому ваше предварительное условие не должно запрещать этот ввод.Ноль - это ваш рекурсивный базовый случай, а не ошибка.Если бы я поставил предварительное условие для этой функции (хотя я бы этого не сделал), это было бы [(not (neg? it))].

Если бы я писал это с нуля, я бы не стал беспокоиться обо всем рекурсивном шуме, а просто:

(defn make-control-data [num alphabet]
  (apply str (repeatedly num #(apply str (shuffle alphabet)))))
0 голосов
/ 07 ноября 2011

Это правильная функция с использованием рекурсии:

 (defn make-control-data [it  alphabet]
   {:pre [(integer? it) (not (neg? it))]}   
   (if (zero? it) "" 
       (str (reduce str (shuffle alphabet)) (make-control-data (dec it) alphabet))))  

(make-control-data 2 ["a" "b" "c"]) возвращает "bcacab" и

(count (make-control-data 2 ["a" "b" "c"])) возвращает 6.

Также работают следующие работы:

(defn make-control-data [it  alphabet]     
  (if (= it 1) (reduce str (shuffle alphabet))
      (str (reduce str (shuffle alphabet)) (make-control-data (dec it) alphabet))))    

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

...