我正在阅读尾递归,如下所示
尾递归是指最后一行的递归调用.通过将主体包含在while循环中并用每个函数参数的一个赋值替换递归调用,可以机械地消除尾递归.
例如
void print(Iterator start, Iterator end, ostream& out=cout) {
if(start == end)
return;
out << *start++ << endl;
print(start, end, out);
}
Run Code Online (Sandbox Code Playgroud)
通过上述规范转换为迭代
void print(Iterator start, Iterator end, ostream& out=cout) {
while(true) {
if(start == end)
return;
out << *start++ << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的段落中提到"用每个函数参数用一个赋值替换递归调用,但在给定的例子中我们没有任何赋值?
任何人都可以解释并提供有关如何将递归转换为迭代函数的上述解释示例吗?
赋值隐藏在增量运算符中:
start++;
Run Code Online (Sandbox Code Playgroud)
实际上是一项任务:
start = start+1;
Run Code Online (Sandbox Code Playgroud)
实际上,这个例子(第一部分)并不是很好.
out << *start++ << endl;
print(start, end, out);
Run Code Online (Sandbox Code Playgroud)
应该
out << *start << endl;
print( start+1, end, out);
Run Code Online (Sandbox Code Playgroud)
我不认为,无论你指的是什么段落都很重要; 只关注主要问题,你想将递归函数转换为正常的迭代函数,这可以(毫不费力地)完成,
void print(Iterator start, Iterator end, ostream& out=cout) {
while(start != end) {
out << *start++ << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
593 次 |
| 最近记录: |