如何打破循环? var largest=0 for(i<-999 to 1 by -1) { for (j<-i to 1 by -1) { val product=i*j if (largest>product) // I want to break out here else if(product.toString.equals(product.toString.reverse)) largest=largest max product } } 如何将嵌套的循环转换为尾递归? 从FOSDEM 2009 上的Scala Talk http://www.slideshare.net/Odersky/fosdem-2009-1013261在第22页上: 中断并继续Scala没有它们。为什么?它们有点必要。更好地使用许多较小的函数发行如何与闭包进行交互。不需要它们! 有什么解释?
我发现这个问题有关的语言优化尾递归。为什么C#尽可能不优化尾递归? 在具体情况下,为什么不将该方法优化为循环(如果需要的话,Visual Studio 2008 32位)? private static void Foo(int i) { if (i == 1000000) return; if (i % 100 == 0) Console.WriteLine(i); Foo(i+1); }
我今天在Unix中发现了“ time”命令,以为我会用它来检查Haskell的尾递归函数与普通递归函数之间的运行时差异。 我编写了以下函数: --tail recursive fac :: (Integral a) => a -> a fac x = fac' x 1 where fac' 1 y = y fac' x y = fac' (x-1) (x*y) --normal recursive facSlow :: (Integral a) => a -> a facSlow 1 = 1 facSlow x = x …
我想测试foldl vs foldr。从我所看到的情况来看,由于尾部递归优化,您应该在可能的情况下使用foldl over foldr。 这很有道理。但是,运行此测试后,我感到困惑: 文件夹(使用时间命令时需要0.057s): a::a -> [a] -> [a] a x = ([x] ++ ) main = putStrLn(show ( sum (foldr a [] [0.. 100000]))) foldl(使用time命令时需要0.089s): b::[b] -> b -> [b] b xs = ( ++ xs). (\y->[y]) main = putStrLn(show ( sum (foldl b [] [0.. …
我试图弄清楚C#编译器如何处理尾部调用。 (答案:不是。但是64位JIT将执行TCE(尾部调用消除)。有限制条件。) 因此,我使用递归调用编写了一个小型测试,该测试打印了在StackOverflowException终止进程之前被调用多少次。 class Program { static void Main(string[] args) { Rec(); } static int sz = 0; static Random r = new Random(); static void Rec() { sz++; //uncomment for faster, more imprecise runs //if (sz % 100 == 0) { //some code to keep this method from being …