Questions tagged «recursion»

有关对象的问题,例如使用自身的“较小”实例表示的功能,算法或数据结构。

4
什么是尾递归?
我知道递归的一般概念。在研究quicksort算法时,我遇到了尾递归的概念。在MIT 18:30秒的视频中,快速排序算法的视频中,教授说这是一种尾递归算法。我不清楚尾递归到底意味着什么。 有人可以举例说明这个概念吗? SO社区在此处提供了一些答案。

5
迭代可以代替递归吗?
我一直看到堆栈溢出,例如here,here,here,here,here以及其他我不愿提及的其他内容,“任何使用递归的程序都可以仅通过迭代转换为程序”。 甚至还有一个非常upvoted 线程具有高度upvoted 答案是肯定的说,这是可能的。 现在我不是说他们错了。只是这个答案抵消了我对计算的微薄知识和理解。 我相信每个迭代功能都可以表示为递归,而维基百科对此有一个陈述。但是,我怀疑相反是真的。首先,我怀疑非原始递归函数是否可以迭代表示。 我也怀疑超级运算是否可以迭代表示。 在对我的问题 @YuvalFIlmus的回答(我不明白)中,他说不可能将任何数学运算序列转换为一系列加法运算。 如果YF的答案确实是正确的(我想是的,但是他的推理超出了我的脑袋),那么这是否意味着并非每个递归都可以转换为迭代?因为如果有可能将每个递归转换为迭代,我将能够将所有操作表示为一系列加法。 我的问题是这样的: 可以将每个递归转换为迭代吗,为什么? 请给一个聪明的高中生一个答案,或者本科一年级的学生会理解。谢谢。 PS我不知道什么是原始递归(我确实知道Ackermann函数,它不是原始递归,但仍然可以计算。我对它的了解也来自Ackermann函数的Wikipedia页面。) PPS:如果答案是肯定的,例如您可以编写非原始递归函数的迭代版本。例如,答案是Ackermann。它会帮助我理解。


6
什么是GCD最有效的?
我知道Euclid算法是获取正整数列表的GCD(最大公约数)的最佳算法。但是实际上,您可以通过多种方式对该算法进行编码。(就我而言,我决定使用Java,但C / C ++可能是另一种选择)。 我需要在程序中使用最高效的代码。 在递归模式下,您可以编写: static long gcd (long a, long b){ a = Math.abs(a); b = Math.abs(b); return (b==0) ? a : gcd(b, a%b); } 在迭代模式下,它看起来像这样: static long gcd (long a, long b) { long r, i; while(b!=0){ r = a % b; a = b; b = …

2
具有嵌套组件的归纳类型的递归定义
考虑归纳类型,它在嵌套但严格为正的位置中具有一些递归出现。例如,具有节点的有限分支的树使用通用列表数据结构来存储子级。 Inductive LTree : Set := Node : list LTree -> LTree. 通过对树和树列表进行递归来定义这些树的递归函数的幼稚方法不起作用。这是带有size计算节点数的函数的示例。 Fixpoint size (t : LTree) : nat := match t with Node l => 1 + (size_l l) end with size_l (l : list LTree) : nat := match l with | nil => 0 | cons …

3
为什么循环比递归快?
在实践中,我知道任何递归都可以写成一个循环(反之亦然(?)),如果我们用实际的计算机进行测量,我们发现对于相同的问题,循环比递归要快。但是,有什么理论可以使这种区别发生或者它主要是实证的?

2
Y组合器是否与Curry-Howard对应矛盾?
Y组合器的类型为。根据库里·霍华德 Curry-Howard)的对应关系,因为类型被居住,所以它必须对应于一个真定理。但是始终为真,因此似乎Y组合器的类型对应于定理,但并不总是正确的。怎么会这样?(a → a )→ a(一种→一种)→一种(a \rightarrow a) \rightarrow a(a → a )→ a(一种→一种)→一种(a \rightarrow a) \rightarrow a一→ 一一种→一种a \rightarrow a一种一种a

3
是否可以遍历一棵树而无需递归,堆栈或队列,而只需几个指针?
半年前,我坐在一个数据结构课上,如果有人可以在不使用递归,堆栈,队列等(或任何其他类似数据结构)而仅使用几个指针的情况下遍历一棵树,教授将提供额外的荣誉。我想出了一个我认为是对这个问题的明显答案,最终被教授接受了。我和同一系的另一位教授坐在一门离散数学课上,他断言没有递归,堆栈,队列等就不可能遍历一棵树,而且我的解决方案无效。 那么,有可能还是不可能?为什么或者为什么不? 编辑:为澄清起见,我在具有三个元素的二叉树上实现了这一点-每个节点上存储的数据和指向两个孩子的指针。我的解决方案仅需少量更改即可扩展到n元树。 我的数据结构老师没有对树的变异施加任何限制,实际上,后来我发现他自己的解决方案是使用子指针在回落的过程中指向树的后方。我的离散数学教授说,根据树的数学定义,树的任何突变都意味着它不再是树,他的定义还将排除指向父代的任何指针,这与我上面解决它的情况相符。

2
该程序会为每个整数终止吗?
在GATE准备的零件测试中,存在一个问题: f(n): if n is even: f(n) = n/2 else f(n) = f(f(n-1)) 我回答“它将终止于所有整数”,因为即使对于某些负整数,它将终止为Stack Overflow Error。 但是我的朋友不同意说,由于这不是实现的代码,而只是伪代码,因此在某些负整数的情况下将是无限递归的。 哪个答案正确,为什么?

2
缺点的什么性质可以消除尾部递归模缺点?
我熟悉基本尾部递归消除的概念,其中可以将返回调用自身直接结果的函数重写为迭代循环。 foo(...): # ... return foo(...) 我还了解,在特殊情况下,如果将递归调用包装在对的调用中,则仍然可以重写该函数cons。 foo(...): # ... return (..., foo(...)) 的什么性质cons允许?除了cons可以包装递归尾部调用而又不破坏我们迭代重写的功能之外,还有哪些功能呢? GCC(但不是Clang)能够优化 “尾递归模乘 ”的示例,但是尚不清楚哪种机制可以发现它或如何进行转换。 pow(x, n): if n == 0: return 1 else if n == 1: return x else: return x * pow(x, n-1)

6
复杂递归算法的示例
我正在向一个朋友解释著名的确定性线性时间选择算法(中值算法的中位数)。 该算法的递归(非常简单)非常复杂。有两个递归调用,每个递归调用具有不同的参数。 我试图找到这种有趣的递归算法的其他示例,但找不到任何示例。我可以提出的所有递归算法要么是简单的尾部递归,要么是简单的分而治之(两个调用是“相同的”)。 您能否举一些复杂的递归示例?

1
这是将任何递归过程转换为尾递归的通用方法吗?
看来我已经找到了将任何递归过程转换为尾递归的通用方法: 使用额外的“结果”参数定义帮助程序子过程。 将应用于过程的返回值的参数应用于该参数。 调用此帮助程序过程即可开始。“结果”参数的初始值是递归过程的退出点的值,因此,最终的迭代过程将从递归过程开始收缩的地方开始。 例如,这是要转换的原始递归过程(SICP练习1.17): (define (fast-multiply a b) (define (double num) (* num 2)) (define (half num) (/ num 2)) (cond ((= b 0) 0) ((even? b) (double (fast-multiply a (half b)))) (else (+ (fast-multiply a (- b 1)) a)))) 这是转换后的尾递归过程(SICP练习1.18): (define (fast-multiply a b) (define (double n) (* …


1
河内塔楼,但具有任意初始和最终配置
最近,我遇到了这个问题,河内塔楼的变种。 问题陈述: 考虑一下河内著名问题塔的以下变化: 我们给了塔和m个大小为磁盘堆叠在一些塔上。您的目标是以尽可能少的动作将所有磁盘转移到塔中,但要考虑以下规则:1 ,2 ,3 ,... ,中号ķ 第ññn1 ,2 ,3 ,... ,米1个,2,3,…,米1,2,3,\dots,mķ日ķ日k^{\text{th}} 一次只移动一个磁盘, 永远不要将较大的磁盘移动到较小的磁盘, 只能在最高距离塔之间移动。ddd (原始问题的局限性是: 和。测试用例的数量。您可以假设所有问题都可以通过不超过动作来解决 。)米≤ 100 ≤ 1000 200003 ≤ Ñ ≤ 10003≤ñ≤10003 \le n \le 1000米≤ 100米≤100m \le 100≤ 1000≤1000\le 1000200002000020000 这是一个有趣的。河内问题的经典塔有一个源,目标和临时塔,用于将磁盘从源移动到目标。该站点上提出的问题基本上具有初始和最终配置。 一个人如何解决这个问题?


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.