【发布时间】:2016-03-30 18:36:59
【问题描述】:
折叠散列函数将其输入(在本例中为 int)分解为 p 长度的段并添加这些部分。如果(not (= (mod input p) 0 )),即输入的长度不是p的倍数,则最后一段可能是小于p的任意长度。
到目前为止,这是我的代码:
(def firstX
(fn [x item]
(take x (str item))))
(def remX
(fn [x item]
(drop x (str item))))
(def divItemEq
(fn [a digits]
(cond (> digits (count (str a))) (a)
true (cons (list (firstX digits a)) (divItemEq (remX digits a) digits)))))
(def sumDigits
(fn [x]
(reduce + x)))
(def exItem1 76123451001214)
(print (sumDigits (divItemEq exItem1 3)))
此时,由于 divItemEq 中的递归条件从未满足,因此会发生无限递归(堆栈溢出)。我尝试解决这个问题导致了各种类型/转换错误。
对如何改进divItemEq有任何建议吗?
【问题讨论】:
-
您已经解释了实际行为(
StackOverflowError);你能给出预期/期望的行为吗? -
期望的行为:(divItemEq exItem1 3) 计算结果为 ((761) (234) (510) (012) (14)),它被传递给 sumDigits。该应用程序产生 1531。旁注:我在第二次检查时更正了递归情况。我预计我的麻烦源于我对 Clojure 类型系统的基本理解。
-
改用
partition。 -
我希望避免使用内置函数,但感谢
partition@jmargolisvt 的建议 -
我想我的麻烦是将 int 输入转换为 lat(原子列表)之类的东西
标签: clojure hash-function