我在这个函数中遇到了问题,尽管编译没有错误!
该函数获取两个长度为n
的向量,另一个长度为2^n
的向量和一个索引。该函数执行简单的计算,然后返回一个向量。
尝试调用该函数时出现问题。例如:
(check [1 2 3] [1 2 3] [1 2 3 4 5 6 7 8] 1)
java.lang.IllegalArgumentException: Key must be integer (NO_SOURCE_FILE:0)
功能定义:
(defn check [row1 row2 arr j]
(
(def x1 (nth arr (nth row1 j)))
(def x2 (nth arr (nth row2 (- j 1))))
(def x3 (nth arr (nth row1 (- j 1))))
(if (<= x1 x2)
(
(def row1 (assoc row1 j x3))
row1
)
((def row1 (assoc row1 (- j 1) x2))
row1)
)
)
)
答案 0 :(得分:7)
我清理了你的代码:
(defn check [row1 row2 arr j]
(let [x1 (nth arr (nth row1 j))
x2 (nth arr (nth row2 (- j 1)))
x3 (nth arr (nth row1 (- j 1)))]
(if (<= x1 x2)
(assoc row1 j x3)
(assoc row1 (- j 1) x2))))
我不知道这是否符合您的要求,但函数会进行评估,并返回合理的值,例如
user=> (check [1 2 3] [1 2 3] [1 2 3 4 5 6 7 8] 1)
[2 2 3]
答案 1 :(得分:5)
您可能应该先尝试解决以下问题:
(let [name1 value1 name2 value2] ...)
。 def实际上是用于在命名空间中定义某些内容,而不是用于本地值。(let [row1 (assoc row1 j x3)] ...)
(def x1 (nth arr (nth row1 j)))
的结果作为函数调用。这几乎肯定不是你想要的。将defs转换成let应该有助于解决这个问题。