当我偶然发现this problem时,我正在研究Project Euler问题。我编写了一个程序,可以在Ruby on Rails(语言新手)中正确解决它:
class Collatz
def search
counter = 0
storage = 0
amount = 0
(1..1000000).each do |i| i += 1
temp = i
while temp != 1
temp = temp & 1 == 1 ? 3 * temp + 1 : temp >> 1
counter += 1
end
if counter > amount
amount = counter
storage = i
end
counter = 0
end
puts storage
end
end
start = Time.now
collatz = Collatz.new
collatz.search
ending = Time.now
puts "Time: #{ending - start}"
我意识到需要很长时间,确切地说是15.185317秒。 但是,当我尝试Java时,时间要短得多:
public class Euler{
private static void problem() {
long a;
int j;
int max = 0;
int maxnr = 0;
for(int i = 1; i < 1000000; i++) {
a = i;
j = 1;
while( a != 1 ) {
a = ((a & 1) == 1) ? (3 * a + 1) : (a >> 1);
j++;
}
if(j > max) {
max = j;
maxnr = i;
}
}
System.out.println(maxnr);
}
public static void main(String[] args) {
long ct = System.currentTimeMillis();
problem();
long nt = System.currentTimeMillis() - ct;
System.out.println(nt);
}
最后这个程序耗时769毫秒。我使用RubyMine for Ruby和Intellij IDEA for Java。我似乎无法弄清楚为什么需要这么长时间,而且我不确定它是否正常。这项任务似乎并不太难,因为我只是在循环。
答案 0 :(得分:3)
你对这个问题的解决方案很差。它涉及做大量的重复工作。显然,JVM在优化冗余工作方面要比Ruby好得多。
但是,如果您要编写一个明确使用以前工作的正确解决方案,您会发现如果您在Ruby或Java上运行它将无关紧要。您可以使用数组或映射来存储以前的结果。这种技术也称为动态编程。