tail-recursion

    13热度

    4回答

    有时它很简单(如果自我调用是最后一个语句,它是尾递归),但仍有一些情况令我困惑。一位教授告诉我,“如果在自助之后没有执行的指令,那就是尾递归”。这些例子如何(忽略它们没有多大意义的事实): a)这一个应该是尾递归的,看看自我调用是最后一个语句,并且在它之后没有什么可以执行的。 function foo(n) { if(n == 0) return 0; else

    3热度

    1回答

    我有一个深度递归函数,即使在大量输入的情况下,理论上也应该可以很好地工作。问题在写这篇文章的时候,我忘记了C#并没有很好地完成尾部优化,如果有的话,那么我会得到StackOverflowExceptions以满足任何复杂的输入。该方法的基本结构是两种大方法,每种方法都称为另一种方法。 public object Simplify(object param) { if (IsSimple(

    5热度

    2回答

    我想编写一个函数来使用尾递归来查找C(n,k),我将非常感谢您的帮助。 我已经达到了这一点: (defun tail-recursive-binomial (n k) (cond ((or (< n k) (< k 0)) NIL) ((or (= k 0) (= n k)) 1) (T (* (tail-recursive-binomial (- n 1) (-

    3热度

    3回答

    因此,我试图从给定的N元素集合中找到所有k元素子集的问题。我知道使用公式C(n,k)= C(n-1,k-1)+ C(n-1,k)的k个子集的总数是多少,我也知道如何去做以迭代的方式,但是当我尝试去思考递归解决方案时,我陷入了困境。任何人都可以给我一个提示吗? 谢谢!

    3热度

    2回答

    在下面的函数中,我试图通过使用累加器来设置尾递归。但是,我遇到了堆栈溢出异常,这导致我相信我设置函数的方式不能正确启用尾部递归。 //F# attempting to make a tail recursive call via accumulator let rec calc acc startNum = match startNum with | d when d = 1

    2热度

    4回答

    这实际上是F#中的项目Euler Problem 14的解决方案。但是,当试图计算大数的迭代序列时,我遇到了System.OutOfMemory异常。正如你所看到的,我正在用tail调用写我的递归函数。 由于我在Visual Studio中调试(禁用尾部调用),我遇到了StackOverFlowException的问题。我已经记录了in another question。在这里,我以发布模式运行

    18热度

    6回答

    我有一个家庭作业分配,要求使用直接递归来查找数组中最左侧,最下侧,负数整数的索引。额外的要求是函数的参数是数组和大小,没有有效值的返回值是-999。 我想出了这一点: int LowIndexMinNeg(int src[], int size) { if (size == 0) return -999; int index = LowIndexMinNeg(sr

    2热度

    4回答

    是否可以在同一个Clojure函数中同时使用反复和后置条件功能?我希望使用后置条件抛出异常,但Clojure似乎试图在异常抛出代码后以某种方式封装异常抛出代码,所以(就像一个愚蠢的示例)这样的函数无法评估。 (defn countup [x] {:pre [(>= x 0)] :post [(>= % 0)]} (if (< x 1000000) (recu

    4热度

    2回答

    /向前递推我不明白为什么这是向前递推: int count(int x) { if(x<=0) return 0; return 1 + count(x - 1); } 这是对模拟考试的问题时,得到的答复是,其前向迭代。为什么会这样?我怎么能区分这两者?

    29热度

    6回答

    我经常听到有人说C不执行尾呼叫消除。尽管标准没有保证它,但是它在任何体面实施中都不是在实践中执行的吗?假设你只针对成熟,实现良好的编译器,并且不关心针对为不明显平台编写的原始编译器的绝对最大可移植性,那么依靠C中的tail call消除是否合理? 此外,将尾部呼叫优化离开标准的原因是什么?