很简单,什么是尾部调用优化?更具体地说,任何人都可以显示一些可以应用的小代码片段,而不是在哪里,并解释为什么?
language-agnostic algorithm recursion tail-recursion tail-call-optimization
我有一个关于如何将'recursion'转换为'tail recursion'的问题.这不是一个功课,只是当我试图从算法书中修改递归定理时弹出一个问题.我熟悉使用递归(factorial和Fibonacci序列)的两个典型示例,并且还知道如何以递归方式和尾递归方式实现它们.我的代码如下(我使用Perl只是为了简单,但可以很容易地转换为C/Java/C++)
#this is the recursive function
sub recP {
my ($n) = @_;
if ($n==0 or $n==1 or $n==2) {
return 1;
} else {
return (recP($n-3)*recP($n-1))+1;
}
}
for (my $k=1;$k<10;$k++) {
print "*"x10,"\n";
print "recP($k)=", recP($k), "\n";
}
Run Code Online (Sandbox Code Playgroud)
运行代码时,输出如下:
recP(1)=1
recP(2)=1
recP(3)=2
recP(4)=3
recP(5)=4
recP(6)=9
recP(7)=28
recP(8)=113
recP(9)=1018
Run Code Online (Sandbox Code Playgroud)
在返回之前,递归函数用不同的参数调用自己两次; 我尝试了几种方法将其转换为尾递归方式,但都错了.
任何人都可以查看代码并向我展示使其尾递归的正确方法吗?特别是我相信这个树递归的转换有一个例程(在返回之前多次调用递归函数),可以对此有所了解吗?所以我可以使用相同的逻辑来处理不同的问题.提前致谢.
我有一个数据库,可以将文件夹关系建模n为嵌套级别。对于任何给定的文件夹,我想生成所有子文件夹的列表。
假设我有一个名为 的函数getChildFolders(),那么调用这种递归循环的最有效方法是什么?
以下代码适用于 4 级嵌套,但我希望在指定递归深度或在没有更多子级可跟随时智能地停止循环方面具有更大的灵活性。
folder_ids = []
folder_ids.append(folder.id)
for entry in child_folders:
folder_ids.append(entry.id)
child_folders_1 = getChildFolders(entry.id)
for entry_1 in child_folders_1:
folder_ids.append(entry_1.id)
child_folders_2 = getChildFolders(entry_1.id)
for entry_2 in child_folders_2:
folder_ids.append(entry_2.id)
child_folders_3 = getChildFolders(entry_2.id)
for entry_3 in child_folders_3:
folder_ids.append(entry_3.id)
Run Code Online (Sandbox Code Playgroud)