tail-recursion

    2热度

    4回答

    我试图通过该序列的第一个元素递归地追加到列表中建立从序列列表: open System let s = seq[for i in 2..4350 -> i,2*i] let rec copy s res = if (s|>Seq.isEmpty) then res else let (a,b) = s |> Seq.head Con

    5热度

    2回答

    一些背景优先。我目前正在学习一些关于monadic解析器组合器的东西。当我试图从this paper(第16-17)转移“chainl1”功能,我想出了这个解决方案: let chainl1 p op = parser { let! x = p let rec chainl1' (acc : 'a) : Parser<'a> = let p' = parser {

    16热度

    3回答

    我不知道为什么 Prelude> head $ reverse $ [1..10000000] ++ [99] 99 不会导致堆栈溢出错误。在序幕++似乎直截了当和非尾递归: (++) :: [a] -> [a] -> [a] (++) [] ys = ys (++) (x:xs) ys = x : xs ++ ys 编辑:起初,我以为这个问题有什么做的方式++中拉开序幕的定义,尤

    2热度

    2回答

    我正在创建一个制作房间的工厂,并且它传递了一个int步骤和一个启动空间,应该做一步,建立一个房间,然后用更少的步骤和新的房间作为起始房间。问题是它永远不会结束。在调试器中,我可以看到它正在调用它自己,它在内存中创建另一个方法调用,实际上只有一个步骤,但执行线会跳到方法调用的最前面!所以它永远不会完成新的呼叫。就好像它将新的调用放入堆栈而不是堆栈中,然后再也没有真正做到。 代码: @Override

    4热度

    4回答

    如果我记得正确,尾递归函数总是有一个简单的非递归等价。 由于递归涉及不必要的函数调用开销,所以最好不要使用非递归方式。 这个假设总是如此吗?是否有任何其他论点/反对尾递归?

    8热度

    1回答

    最近,我正在学习F#。 我尝试以不同的方式解决问题。 像这样: (* [0;1;2;3;4;5;6;7;8] -> [(0,1,2);(3,4,5);(6,7,8)] *) //head-recursive let rec toTriplet_v1 list= match list with | a::b::c::t -> (a,b,c)::(toTriplet_

    2热度

    5回答

    我写了一些代码来学习F#。 这里有一个例子: let nextPrime list= let rec loop n= match n with | _ when (list |> List.filter (fun x -> x <= (n |> double |> sqrt |> int)) |> List.forall (fun x -> n % x <> 0)

    7热度

    1回答

    我希望看到.tail IL指令,但使用我一直在写的tail调用的简单递归函数显然是优化成循环的。我实际上正在猜测,因为我不完全确定Reflector中的循环是什么样的。尽管我确实没有看到任何.tail操作码。我在项目的属性中选中了“生成尾部呼叫”。我也尝试了反射器中的Debug和Release版本。 我使用的代码是从Programming F# by Chris Smith,190页: let f

    8热度

    2回答

    如何类型的值: type Tree = | Node of int * Tree list 有引用自身的功能性的方式所产生的价值呢? 所得值应等于在以下Python码x,对于树的合适定义: x = Tree() x.tlist = [x] 编辑:显然更多的解释是必要的。我正在尝试学习F#和函数式编程,所以我选择实现我以前编写过的其他语言的cover tree。这里的相关内容是每

    7热度

    1回答

    我有一个关于Clojure的问题: 我想通过Project Euler去学习语言,我不明白底下发生了什么:下面的代码是为了使用返回所有素数列表,最高可达lim。我认为它应该是堆空间中的O(n),因为我列出了所有数字列表,最多为lim,然后逐个将它们过滤掉,同时将第一个移动到新列表中。 (我知道,我其实做新列出了每个易复发,但我没想到他们会采取更多的内存?)反正我与 (defn getAllPrim