【发布时间】:2019-11-07 22:14:25
【问题描述】:
我在网站上看到以下内容作为练习。它基本上说在不使用递归和不使用向量、堆栈等结构的情况下编写以下函数:
void rec(int n) {
if (n != 0) {
cout << n << " ";
rec(n-1);
rec(n-1);
}
}
起初我以为这很容易,但我却出人意料地努力完成它。
为了更好地理解它,我将它定义为一个数学函数,如下所示:
f(x) = {1 if x = 0, f(x-1) + f(x-1) else}(其中 + 运算符表示连接,- 是正常的减号)
但是,展开这个变得更加困难,我被困住了。有没有直接的方法把它写成循环?而且,更一般地说,是否有解决此类问题的算法?
【问题讨论】:
-
请记住,递归只是利用堆栈为您工作的一种方式。总有一种等效的方法,您可以使用循环来管理自己的堆栈。
-
@tadman 我知道,当时我在学习时做了很多这样的事情,但我认为有一个非常简单的方法,我看不到。通常展开递归总是对我有用。
-
问题是这两个路径分支,然后这两个分支也是如此。也许您可以考虑它给出的输出,然后找到这些数字的模式并在此基础上实施。
-
@tadman 正如我所说,我展开了递归并看到了模式,但我不知道如何使用循环轻松实现它。我知道肯定有一种方法,因为递归和迭代具有与您所说的相同的“力量”。
-
这个怎么样? Attempt on coliru ;-) 回忆已经完成的输出是否超出了您的限制? (恐怕是这样。实际上,是
std::ostringstream被“滥用”为堆栈。)