我正在Clojure的Project Euler问题14上工作.我有一个很好的通用算法,我得到了正确的结果,但我很难理解为什么我的函数与Java中的等效函数相比(我相信)是如此之慢.这是我的Clojure函数,用于从给定的起始编号获取Collatz链的长度:
(defn collatz-length
[n]
(loop [x n acc 1]
(if (= 1 x)
acc
(recur (if (even? x)
(/ x 2)
(inc (* 3 x)))
(inc acc)))))
Run Code Online (Sandbox Code Playgroud)
这是我的Java函数做同样的事情:
public static int collatzLength(long x) {
int count = 0;
while (x > 1) {
if ((x % 2) == 0) {
x = x / 2;
} else {
x = (x * 3) + 1;
}
count++;
}
return count;
}
Run Code Online (Sandbox Code Playgroud)
为了计算这些函数的性能,我使用了以下Clojure代码:
(time (dorun (map collatz-length (range …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用bash函数来执行多个Web抓取(使用curl等),我想让它们全部在后台执行,并且所有打印输出到stdin.这怎么可能?
看起来,当将Ruby代码放在可执行脚本中时,String的索引行为与IRB中的行为不同,或者直接运行Ruby代码.例如:
$ cat > test
#!/usr/bin/ruby -w
puts 'hello'[0]
$ chmod +x test
$ ./test
104
$ ruby -e "puts 'hello'[0]"
h
Run Code Online (Sandbox Code Playgroud)
为什么是这样?而且,如何使可执行脚本的行为与"普通"Ruby代码相同?
请考虑以下代码:
System.out.println(1 + 0xFFFFFFFFL);
System.out.println(1L + 0xFFFFFFFF);
Run Code Online (Sandbox Code Playgroud)
第一行打印预期值,4294967296.但第二行打印出一个0.我检查了两个表达式的类型(通过将它们传递给方法),并且两者都被longJVM 识别.Lava 7语言规范指出,对于二进制操作,"如果任一操作数的类型为long,则另一个操作数转换为long".这似乎正在发生,但我有两个问题:
如果两个操作数最终都是long,为什么第一个表达式中的高阶位被切断?
为什么订单很重要?