Questions tagged «recursion»

有关递归的问题,是从自身内部调用方法或函数的实践。

3
多少个嵌套函数调用?
从MSDN引用有关StackOverflowException的信息: 当执行堆栈溢出时引发的异常,因为它包含太多的嵌套方法调用。 Too many这里很模糊。我怎么知道什么时候真的太多了?数千个函数调用?百万?我认为它必须以某种方式与计算机中的内存量相关联,但是是否可以提出一个大致准确的数量级? 我对此很担心,因为我正在开发一个涉及大量使用递归结构和递归函数调用的项目。我不希望我的应用程序在开始用于多个小型测试时会失败。

6
如何确定双重递归函数的运行时间?
给定任意双递归函数,将如何计算其运行时间? 例如(用伪代码): int a(int x){ if (x < = 0) return 1010; else return b(x-1) + a(x-1); } int b(int y){ if (y <= -5) return -2; else return b(a(y-1)); } 或类似的规定。 一个人可以或应该使用什么方法来确定类似的东西?

4
没有TCO时,什么时候需要担心堆叠失败?
每次都针对以JVM为目标的新编程语言进行讨论,不可避免地会有人说: “ JVM不支持尾调用优化,因此我预计会有很多爆炸式堆栈” 该主题有成千上万的变体。 现在,我知道某些语言(例如Clojure)具有可以使用的特殊递归结构。 我不明白的是:缺少尾部呼叫优化有多严重?我什么时候应该担心呢? 我感到困惑的主要根源可能是因为Java是有史以来最成功的语言之一,而且相当多的JVM语言似乎运行得很好。这怎么可能,如果缺乏TCO的是真的任何关注?

2
递归函数调用中返回语句的原因
我只是有一个疑问。以下子例程(例如,在列表中搜索元素)的末尾具有return语句: list *search_list(list *l, item_type x) { if (l == NULL) return(NULL); if (l->item == x) return(l); else return( search_list(l->next, x) ); } 我无法在最后获得return语句的意义(即return search_list(l-> next,x))。如果有人可以使用堆栈模型来解释这个概念,那将非常有帮助。

9
资源,以提高您的递归理解?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 我知道什么是递归(当一个patten在其内部重新出现时,通常是一个函数,在有条件的突破后会在其一行上调用自己...对吗?),如果我仔细研究它们,我就能理解递归函数。我的问题是,当我看到新的示例时,最初总是很困惑。如果我看到一个循环,或者一个映射,压缩,嵌套,多态调用等,我仅通过查看就知道发生了什么。当我看到递归代码时,我的思考过程通常是“这是wtf吗?” 其次是“哦,这是递归的”,其次是“如果他们说可以的话,我想它一定有用。” 那么,您在此方面有什么技巧/计划/资源来培养技能吗?递归是一个很奇怪的概念,因此我认为解决它的方法可能同样很奇怪而且很模糊。

2
有人可以解释Haskell记忆化背后的概念吗?
(请注意,我将问题放在这里是因为它是关于它的概念机制,而不是编码问题) 我当时正在开发一个小型程序,该程序在其等式中使用了斐波那契数列,但是我注意到,如果超过一定数,它会变得非常缓慢,在谷歌上徘徊了一段时间,我偶然发现了Haskell中一种称为的技术Memoization,他们展示了这样的代码: -- Traditional implementation of fibonacci, hangs after about 30 slow_fib :: Int -> Integer slow_fib 0 = 0 slow_fib 1 = 1 slow_fib n = slow_fib (n-2) + slow_fib (n-1) -- Memorized variant is near instant even after 10000 memoized_fib :: Int -> Integer memoized_fib = (map fib …

7
递归函数可以有迭代/循环吗?
我一直在研究递归函数,很显然,它们是可以自我调用的函数,并且不使用迭代/循环(否则它将不是递归函数)。 但是,在网上浏览示例(8皇后递归问题)时,我发现此功能: private boolean placeQueen(int rows, int queens, int n) { boolean result = false; if (row < n) { while ((queens[row] < n - 1) && !result) { queens[row]++; if (verify(row,queens,n)) { ok = placeQueen(row + 1,queens,n); } } if (!result) { queens[row] = -1; } }else{ result = …
12 java  recursion 

2
了解C ++中的回溯
我对C ++的基础知识有很好的基本了解,也对递归的工作方式也有了解。我遇到了一些问题,例如经典的八皇后问题和使用回溯法解决数独问题。 我意识到我对此一无所知,似乎无法回想起递归堆栈并重新开始以解决问题的想法。用笔和纸似乎很容易,但是在为此编写代码时,我对如何开始解决这些问题感到困惑。 如果有一个针对初学者的教程,或者有一本很好的书涵盖了这些内容,那将是很有帮助的。如果有人可以阐明这个话题或给我一些有关体面参考的链接,我将不胜感激。 是的,我确实知道使用功能语言会更容易,但是我也想了解命令式语言的实现。
12 c++  recursion 

7
递归-是“分而治之”还是“代码重用”
递归 -众所周知-是其中的一个问题-绕回头就像在编程之旅中取得“里程碑”。 但是,当涉及到在现实世界中实际使用它时-仅了解递归的机制还不够-在递归是最合适的解决方案的同时,还必须了解问题的性质。 所以我的问题是... 什么是需要递归解决的“问题模式” 是递归形式的“分而治之”策略还是形式的“代码重用”,或者是一种设计模式 您能否举一个现实世界中的示例为例,其中想到递归作为直接解决方案 -更新- 许多答案都将“实际问题”称为遍历树,阶乘等。我更喜欢“真正的实际问题”-让我举个例子... 我们有一个大的文本夹(大约30 MB的文本作为的链接列表structs),我们需要为全文搜索创建一个索引。我们需要将整个索引保留在内存中,然后每10分钟重新为文本建立索引。 每隔10分钟,我们会将整个文本(两个链接列表,逐行)与新生成的文本块进行比较-以查看更改了哪行-然后我们将仅对该行重新索引-这样我们可以避免不必重新索引整个文本。记住-我们需要找到两个30 MB链表之间的差异点。 我的一位同事提出了一个很棒的程序,该程序使用HEAVY递归比较行-然后收集卡盘在阵列中不同的位置-是的,我知道这听起来很令人困惑-递归如何在这里提供帮助-但它做了。 关键是-他怎么看待大量使用递归可以巧妙地解决这个问题?
11 recursion 

3
为什么迭代版本需要更长的时间?
我查看了http://programming.lispdream.com/blog/2011/06/recursion-vs-iteration/,发现在他执行阶乘函数的递归和迭代实现时,迭代实际上需要更长的时间给定n = 1,000。我不知道为什么(他没有解释,而是说这是对读者的练习)。对不起,我很陌生。

4
确定是否可以使用递归解决问题的考虑因素是什么?
有时在面试中,我可能会使用递归来解决问题(例如,添加1到无限精度整数),或者当问题本身适合使用递归时。有时,可能是由于大量使用递归来解决问题,因此,不用考虑太多,就使用递归来解决问题。 但是,在决定使用递归解决问题之前,应考虑哪些因素? 我有一些想法: 如果我们对每次都减半的数据使用递归,那么使用递归似乎没有问题,因为所有可以容纳16GB RAM甚至8TB硬盘的数据都可以通过深度仅为42层的递归进行处理。(因此不会出现堆栈溢出(我认为在某些环境中,堆栈的深度可以达到4000层,远超过42级,但是同时,这还取决于您拥有多少局部变量,因为每个调用堆栈占用的内存更多)如果有很多局部变量,则是确定堆栈溢出的是内存大小而不是级别)。 如果您使用纯递归来计算斐波那契数,那么您真的要担心时间复杂性,除非您缓存中间结果。 以及如何添加1到无限精度整数?也许这是有争议的,例如,您将使用长度为3000位数或4000位数的数字,以至于它会导致堆栈溢出吗?我没想到,但是答案可能不是,我们不应该使用递归,而应该使用普通循环,因为如果在某些应用程序中,该数字确实需要4000位数长,以检查某些数字,该怎么办?数字的属性,例如数字是否为质数。 最终的问题是:在决定使用递归解决问题之前,有哪些注意事项?

3
在对称下唯一生成nxnxn立方晶格中所有m个点的集合的算法
我正在实现一个算法,该算法将在计算上非常复杂,并且想要尝试确保我没有做不必要的工作。 有一个nxnxn立方晶格,例如,如果n = 2,则由(0,0,0),(0,1,0),(1,0,0),(1,1,0),(0, 1,1),(0,0,1),(1,0,1),(1,1,1)。 从这个格子中,我将递归地生成所有m点的集合,例如: solve(set_of_points) { if set_of_points.size = m, finish do some useful computation here for each point in lattice not in set_of_points: solve(set_of_points + new_point); } 然后可以从一个空的set_of_points开始调用。 问题的本质是,我实际上不需要m个点的所有排列,而只需要在立方体自然对称下唯一的那些点。 例如,拿一个2x2x2的多维数据集,并假设我们希望所有1点的集合。在以上基本算法下,有8个不同的1点集。 但是,使用立方体的对称性,我们可以将其减少到1个唯一的1点集,因为在立方体的对称性下所有原始的8个点都是等效的(在这种情况下,它们都是“角”)。 如果立方体是2x2x2且m = 2,则基本算法中有28个集合,但是在对称情况下,该集合减少为3个(例如{(0,0,0),(1,0,0)},{(0 ,0,0),(1,1,0)},{(0,0,0),(1,1,1)}) 显然,对3个点集进行计算要比28个点好得多,所以我的问题是如何不生成与已经生成的点对称对称的点集?或者,如果这不可能,那么我如何至少减少套数。 (请注意-如果m = 1,这相对容易-只需选择比其他任何一个顶点更接近(0,0,0)的点,并且边界处会有一点毛刺。这是因为m> 1成为一个真正的问题)

5
可以对所有递归函数进行迭代编码吗?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 递归的优点是什么? 某些编程语言可以优化尾部递归,但是,总的来说,递归比常规循环消耗更多的资源。 是否可以具有某些递归函数的迭代版本?
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.