我有一个简单的函数,可以将数字相加并相乘。
(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/