Clojure - 使用结果作为参数一遍又一遍地调用函数

标签 clojure

我有一个简单的函数,可以将数字相加并相乘。

(defn add-and-multiply [x y z]
  (let [add (+ x y z) 
        mult (* x y z)] 
    (println "Add: " add) 
    (println "Mult: " mult)))

(add-and-multiply 1 1 2)
Add:  4
Mult:  2
nil

我如何再次调用 add-and-multiply ,而 x 参数现在是 add (4) 的结果,y 参数是 mult (2) 的结果,而 z 参数是相同的 (2)。

我怎样才能重复这个过程 100 次,然后打印 add 和 mult 的最终值?

任何帮助将不胜感激。谢谢

最佳答案

如果发现 100 次迭代后的结果太大而无法装入 RAM,我不会感到惊讶。除非我误解了公式,否则这很像计算 x*(x^2)*(x^4)*(x^8)...直到 x^( 2^100),简化为 x^(2^200)。它实际上更大,因为还有一个加法步骤,但我认为与迭代乘法相比,这相对较小。 2^200 已经相当大了,但是如果需要的话您可以计算它。

但是,2^(2^200) 是非常巨大的。显然,您至少需要 2^200 位 RAM 才能保存该数字而不损失精度。典型的台式计算机可能有 16GB RAM,即 2^30(十亿)* 16 GB * 8 位/字节 = 2^37 位存储。您不仅需要一台台式计算机来存储此数据,还需要 2^163 台台式计算机。我再次强调这个数字有多大。如果地球上的每一粒沙子都是一台具有 16GB RAM 的台式电脑,那么您根本无法存储这个数字。

所以,我想说,假设你买不起整个星系的计算能力,你可能应该想出一种不同的方法来解决你真正的问题。

也就是说,关于如何将 (f (f (f (f x)))) 推广到任意数量的 f 调用的机制,另一个答案已经很好地解释了如何使用iterate,并且如果您选择运行时更易于管理的f,将会对您很有帮助。

关于Clojure - 使用结果作为参数一遍又一遍地调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43676782/

相关文章:

git - Clojure:GitHub 中 update-in 的两种不同定义

clojure - Clojure 中的 Java,评估问题

Clojure:从符号列表中定义多重方法?

clojure - 确保 var 在 Clojure 中绑定(bind)

clojure - 在 Clojure 中使用二维数组的最佳实践?

macros - 如何使用defmacro代替eval?

clojure:为命名空间中的每个函数添加调试跟踪?

clojure - 如何使用 Clojure.Spec 指定映射中的两个键应具有相同的值?

clojure.async : "<! not in (go ...) block" error

clojure - 如何标记 Clojure 函数以便可以通过 Java 反射识别它