c++ - 使用堆栈递归循环

标签 c++ loops recursion stack

我想使用堆栈和循环将以下程序转换为非递归代码:

void write(int n) {
    if (n>0) {
        write(n-1);
        cout << n << " ";
        write(n-1);
    }
}

这是我正在使用的代码,但目前不起作用,我不知道为什么:

stack<int> S;
S.push(n);
while (not S.empty()) {
    int k = S.top(); 
    S.pop()
    if (k>0) {
        S.push(k-1);
        cout<<k<<" ";
        S.push(k-1);
    }
}

它不起作用,我不知道如何模拟该递归。我认为将等效的递归调用插入堆栈就足够了。

谢谢

最佳答案

问题是您向堆栈执行了 2 次推送,但在使用所有调用链进行打印之前,首先递归调用了 write()

这是递归调用的等效迭代:

std::stack<int> S;
for( int i = n; i > 0; --i )
   S.push( i );

while( not S.empty() ) {
    int k = S.top();
    S.pop();
    for( int i = k - 1; i > 0; --i ) {
        S.push( i );
    }
    std::cout << k << " ";
}

关于c++ - 使用堆栈递归循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26389312/

相关文章:

c++ - C2975 'N' 的无效模板参数,预期的编译时常量表达式

c++ - 是否可以阻止引用的向上转换?

python - 如何生成许多列表并为其赋值

C++ Palindrome Creator 递归程序

c++ - 用户自定义结构的双端队列

C 输入的计数用逗号分隔

python - 在python列表中的每个项目的字符串前面添加一个字符串

java - 如何修复CodingBat中的递归代码错误?

recursion - 递归函数是否可重入

c++ - 在 boost::bind 中使用已删除的函数