将这个c ++代码翻译成clojure的最正确方法是什么?
代码示例:if((J%2) == 0) {det += src[0][J]*calcDet( min, ord-1)};}
答案 0 :(得分:4)
使用C ++代码,$options
的值正在改变。这里返回了det
的新值:
det
从代码中删除可变性最正确。
(fn [calcDet src ord min det J]
(if (zero? (mod J 2))
(+ det (* (nth (nth src 0) J)
(calcDet min (dec ord))))
det))
和J
似乎是唯一正在改变的变量,因此我将它们作为最后两个参数放在一起。您可能希望det
超过reduce
的值,其中J
是累加器,在这种情况下使用det
来获取一个函数,该函数仍然是最后两个args提供。
或者你可以partial
通过类似的函数,生成一个新状态的惰性列表,其中每个状态都是iterate
。
Clojure中没有等同于[J det]
的内容。
答案 1 :(得分:0)
好吧,要添加到det
的计算表达式如下所示:
(* (get-in src [0 J]) (calcDet min (dec ord)))
您的if
,假设没有别的,看起来像这样:
(when (even? J)
... do something)
if
分支else
如下:
(if (even? J)
... do something
... otherwise, do something else)
要添加数字,请执行以下操作:
(+ 1 2 3)
然而,当涉及+=
...
思考语法意味着考虑评估表达。价值观不可改变。您 想要做什么,而不是更改 det
?好吧,您想要计算一些值,以添加到您当前绑定到名称det
的任何值。然后,您可以将结果绑定到名称,也可以将其提供给另一个表达式。没有州,只是评估表达。
话虽如此,没有更大的背景,想到“等价”是毫无意义的,因为问题的整体方法会有所不同。
循环,索引数组和就地变异都是代码段的所有功能。虽然这些与现代硬件架构(又名“计算机说话”)一致,但它们有时与人类大脑自然处理问题的方式不一致。因此,除此之外的抽象层次通常允许我们“缩小”并整体查看问题,如果给定工具,我们经常会找到更简洁的解决方案。
因此,在不知道此代码的上下文的情况下,没有“等效”,至少不是惯用的。我特别没有提到原子,它是clojure保持和改变状态的机制之一,因为它们肯定不适用于这段代码。