Questions tagged «recursion»

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


8
递归或while循环
我正在阅读一些开发面试的实践,特别是面试中提出的技术问题和测试,我对这种类型的说法误解了很多次:“好的,您可以用while循环解决问题,现在可以递归”或“每个人都可以用100行while循环解决此问题,但是他们可以用5行递归函数来实现吗?” 等等 我的问题是,递归是否通常比if / while / for构造好? 老实说,我一直认为递归不是首选,因为它仅限于比堆小得多的堆栈内存,而且从性能的角度来看,执行大量的函数/方法调用也不理想。是错的...

5
为什么Java根本没有优化尾递归?
据我所读:原因是因为在继承时,要确定要实际调用的方法并不容易。 但是,为什么Java至少没有对静态方法进行尾递归优化并强制使用正确的方法来用编译器调用静态方法? 为什么Java根本不支持尾递归? 我不确定这里是否有任何困难。 关于建议的副本,如JörgW Mittag 1所述: 另一个问题是关于TCO的,这个是关于TRE的。TRE比TCO简单得多。 此外,另一个问题询问JVM对希望编译为JVM的语言实现施加哪些限制,该问题询问Java,这是不受JVM限制的一种语言,因为JVM规范可以通过以下方式更改:设计Java的人 最后,JVM中甚至没有关于TRE的限制,因为JVM确实具有方法内GOTO,这是TRE所需的全部 1 添加了格式以标注点。

18
用简单的英语来说,递归是什么?
递归的想法在现实世界中不是很普遍。因此,对于新手程序员来说似乎有些困惑。虽然,我猜他们逐渐适应了这个概念。那么,对于他们来说,如何轻松地理解这个主意呢?
74 recursion 

3
递归和核心递归之间有什么区别?
这些有什么区别? 递归 核心递归 在Wikipedia上,几乎没有信息,也没有清晰的代码来解释这些术语。 有哪些非常简单的示例可以解释这些术语? corecursion如何实现递归的对偶? 有没有经典的corecusive算法?

17
没有阶乘,斐波那契数等的递归
我几乎可以找到有关递归的每篇文章,其中包括阶乘或斐波那契数的示例,它们是: 数学 在现实生活中无用 是否有一些有趣的非数学代码示例来教授递归? 我在考虑分而治之算法,但它们通常涉及复杂的数据结构。
47 recursion 

8
有哪些方法可以避免递归算法中的堆栈溢出?
题 解决由递归算法引起的堆栈溢出的可能方法是什么? 例 我正在尝试解决Project Euler问题14,并决定尝试使用递归算法。但是,该程序以java.lang.StackOverflowError停止。可以理解 该算法确实使堆栈溢出,因为我尝试为大量生成Collat​​z序列。 解决方案 所以我想知道:假设您的递归算法编写正确,并且最终会导致堆栈溢出,那么有什么标准方法可以解决堆栈溢出的问题呢?我想到了两个概念: 尾递归 迭代 想法(1)和(2)是否正确?还有其他选择吗? 编辑 最好查看一些代码,最好使用Java,C#,Groovy或Scala。 也许不要使用上面提到的Project Euler问题,这样它就不会被其他人宠坏,而是采用其他算法。阶乘可能,或类似的东西。

8
函数语言是否更擅长递归?
TL; DR:功能语言比非功能语言处理递归的效果好吗? 我目前正在阅读Code Complete2。在本书的某些时候,作者警告我们有关递归的问题。他说,应尽可能避免这样做,并且使用递归的功能通常不如使用循环的解决方案有效。例如,作者使用递归编写了一个Java函数,以计算数字的阶乘(这样可能不完全相同,因为目前我没有这本书)。 public int factorial(int x) { if (x <= 0) return 1; else return x * factorial(x - 1); } 这是一个不好的解决方案。但是,在函数式语言中,使用递归通常是首选的处理方式。例如,以下是Haskell中使用递归的阶乘函数: factorial :: Integer -> Integer factorial 0 = 1 factorial n = n * factorial (n - 1) 并被广泛接受为一个好的解决方案。正如我所看到的,Haskell非常经常使用递归,并且我看不到它被皱眉的任何地方。 所以我的问题基本上是: 功能语言比非功能语言处理递归更好吗? 编辑:我知道我使用的示例不是最好的例子来说明我的问题。我只是想指出,Haskell(通常是功能语言)比非功能语言使用递归的频率更高。


5
性能:JavaScript中的递归与迭代
我最近阅读了一些有关Javascript的功能方面以及Scheme与Javascript之间关系的文章(例如http://dailyjs.com/2012/09/14/functional-programming/)(后者受前者的影响,是一种功能性语言,而OO方面则继承自Self(一种基于原型的语言)。 但是我的问题更具体:我想知道是否有关于Java递归与迭代性能的指标。 我知道在某些语言中(通过设计迭代执行得更好),差异很小,因为解释器/编译器将递归转换为迭代,但是我猜可能不是Javascript的情况,因为它至少部分是功能语言。

2
将循环(while / for)转换为递归或从递归转换为循环的一般方法?
这个问题主要集中在算法上,也许是抽象的并且更学术化。 这个例子提供了一个想法,我想用一种通用的方式,所以例子仅用于使我们更清楚地了解您的想法。 一般来说,循环可以转换为递归的。 例如: for(int i=1;i<=100;++i){sum+=i;} 其相关的递归为: int GetTotal(int number) { if (number==1) return 1; //The end number return number+GetTotal(number-1); //The inner recursive } 最后,为了简化此过程,需要执行尾递归: int GetTotal (int number, int sum) { if(number==1) return sum; return GetTotal(number-1,sum+number); } 但是,大多数情况下都不容易回答和分析。我想知道的是: 1)我们能否获得一种“通用方式”将循环(for / while……)转换为递归?在进行转换时,我们应该注意哪些事情?最好写一些示例的详细信息以及您的persudo理论以及转换过程。 2)“递归”具有两种形式:线性递归和尾递归。那么哪个转换更好呢?我们应该掌握什么“规则”? 3)有时我们需要保留递归的“历史”,这很容易在循环语句中完成: 例如: List<string> history = new List<string>(); …

7
哪些命令式编程语言不支持递归?
据我所知,所有现代命令式编程语言都支持过程可以调用自身的递归。并非总是如此,但是我无法通过Google的快速搜索找到任何困难的事实。所以我的问题是: 哪些语言从一开始就不支持递归?何时添加了这种支持?

2
Y组合器和尾部调用优化
F#中Y组合器的定义是 let rec y f x = f (y f) x f希望将递归子问题的某些延续作为第一个论点。使用yf作为延续,我们可以看到f将应用于后续调用,因为我们可以开发 let y f x = f (y f) x = f (f (y f)) x = f (f (f (y f))) x etc... 问题是,先验的是,该方案无法使用任何尾部调用优化:的确,f中可能存在一些待处理的操作,在这种情况下,我们不能仅仅改变与f相关联的本地堆栈帧。 因此: 一方面,使用Y组合器需要一个与函数本身截然不同的延续。 在其他方面要应用TCO,我们希望f中没有待处理的操作,而仅调用f本身。 您知道这两者可以和解的任何方式吗?就像带累加器技巧的Y或CPS技巧的Y一样?还是有论据证明不可能做到这一点?

10
指针/递归有什么困难?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 在Java学校的危险中, Joel讨论了他在Penn的经历以及“分段错误”的难度。他说 [在您之前,段错误是很难的]“深呼吸,真正尝试迫使您的思想同时在两个不同的抽象级别上工作。” 给出了导致段错误的常见原因的清单,我不明白我们必须如何在2个抽象级别上工作。 由于某种原因,Joel认为这些概念是程序员抽象能力的核心。我不想承担太多。那么,指针/递归到底有什么困难呢?例子会很好。
20 c  pointers  recursion 


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.