很简单,什么是尾部调用优化?更具体地说,任何人都可以显示一些可以应用的小代码片段,而不是在哪里,并解释为什么?
language-agnostic algorithm recursion tail-recursion tail-call-optimization
我知道递归有时比循环更清晰,而且我不会询问何时应该使用递归迭代,我知道有很多问题已经存在.
我要问的是,递归是否比循环更快?对我来说,似乎总是能够改进循环并让它比递归函数更快地执行,因为循环不会不断地设置新的堆栈帧.
我特别关注在递归是处理数据的正确方法的应用程序中递归是否更快,例如在一些排序函数,二叉树等中.
我在这个问题上看到了这个引用:什么是构建Web服务的好函数语言?
特别是Scala不支持尾调用消除,除了自递归函数,这限制了你可以做的组合种类(这是JVM的一个基本限制).
这是真的?如果是这样,那么创建这个基本限制的JVM是什么呢?
迭代比递归更高效,对吧?那么为什么有些人认为递归比迭代更好(用他们的话来说更优雅)?我真的不明白为什么像Haskell这样的语言不允许迭代并鼓励递归?鼓励表现不佳的东西是不是很荒谬(当更高性能的选项即递归可用时也是如此)?请详细说明一下.谢谢.
我怎样才能类型的子控件ComboBox
中MyContainer
Grid
的WPF?
<Grid x:Name="MyContainer">
<Label Content="Name" Name="label1" />
<Label Content="State" Name="label2" />
<ComboBox Height="23" HorizontalAlignment="Left" Name="comboBox1"/>
<ComboBox Height="23" HorizontalAlignment="Left" Name="comboBox3" />
<ComboBox Height="23" HorizontalAlignment="Left" Name="comboBox4" />
</Grid>
Run Code Online (Sandbox Code Playgroud)
这行给了我一个错误:
var myCombobox = this.MyContainer.Children.GetType(ComboBox);
Run Code Online (Sandbox Code Playgroud) 我喜欢递归.我认为它简化了很多事情.另一个可能不同意; 我认为这也使代码更容易阅读.但是,我注意到递归在C#等语言中并没有像在LISP中那样被使用(顺便提一下,这是我最喜欢的语言).
有没有人知道是否有任何好的理由不使用C#等语言的递归?它比迭代更昂贵吗?
是什么区别iteration
和recursion
为什么/时,是一个更好的:
while (true) {
// Iterating
}
Run Code Online (Sandbox Code Playgroud)
和
private void recursion() {
if (true)
recursion(); // Recursing
return;
}
Run Code Online (Sandbox Code Playgroud)
我看到很多recursive
实现,而它可以在一个简单的循环中轻松完成.
好的,只是在F#中,这就是我现在理解的方式:
有些问题本质上是递归的(构建或读出树结构只能命名一个)然后你使用递归.在这些情况下,您最好使用尾递归来使堆栈中断
有些语言是纯粹的功能,所以你必须使用递归而不是while循环,即使问题不是递归的
所以我的问题是:既然F#也支持命令式范式,你会在F#中使用尾递归来解决那些不是自然递归的问题吗?特别是因为我已经读过编译器重新认识尾递归并且只是在while循环中转换它?
如果是这样:为什么?
我正在编写一个代码段,遍历n个数字的每个排列.因此,例如,如果n = 3,我想迭代以下每个元素:
0,0,0
...
0,1,0
...
1,0,0
...
2,3,4
...
9,9,9
使用嵌套for循环很容易编码:
for(digit1 0 to 9)
for(digit2 0 to 9)
for(digit3 0 to 9)
Run Code Online (Sandbox Code Playgroud)
但我想将这个概括为n位数.如果例如n = 10,我现在需要10个嵌套for循环.
我已经考虑过这个并且意识到问题可以通过递归来解决(深度优先搜索树,每个节点有10个子节点,0到10,并且在深度n处停止).但我的目标是高性能,所以我不想因为开销而使用递归.我还有其他什么选择?
recursion ×7
iteration ×4
performance ×3
c++ ×2
java ×2
algorithm ×1
c# ×1
f# ×1
for-loop ×1
jvm ×1
loops ×1
optimization ×1
scala ×1
tree ×1
while-loop ×1
wpf ×1
wpf-controls ×1