首页 > 解决方案 > 使用 while 和 if 递归打印字符

问题描述

我是初学者,试图了解递归是如何工作的。使用 while 和 if int 代码有什么不同?为什么如果我使用“如果”它会产生正确的结果?但“虽然”没有?while(*k) ,当它到达“\ 0”时,它只打印一次,然后它又回到while循环,
非常感谢你的帮助!

 #include <stdio.h>
 #include <stdlib.h>
 void back(char*k){
     if(*k) // works
     //while(*k) ->not work??
         back(++k);
     printf("%c",*k);
 }

 int main()
 {
     char k[]="hellomynameis";
     back(k);
     printf("Hello world!\n");
     return 0;
 }

有没有可能在 c++ 中做同样的事情但使用迭代器?

#include <iostream>
#include <string>

using namespace std;

void backk(string a){
    string::iterator itr;
    for (itr=a.begin();itr!=a.end();itr++){
        if (*itr)
            backk(++itr);
        cout<<a; --> is this possible  ?

        //simple and fast solution 
        for (itr=a.end();itr!=a.begin();itr--){
            if(*itr)
                cout<<*itr;
        }
    }
}

int main()
{
    string a("hello my name is");
    backk(a);
    cout << "Hello world!" << endl;
    return 0;
}

标签: c++recursion

解决方案


关于为什么while不起作用的第一个问题,让我们看看在这种情况下代码如何运行
从一个简单的示例开始,假设我们char[]只是GH\0为了简单起见,嗯,它有点难以解释,但让我们
首先尝试back调用并k指出to G, 因为它不是\0,被edback再次调用所以它指向 'H' 并且它不是这样被另一个调用, 这次是, 所以没有执行并完成它的工作, 现在执行返回到第二次调用,它是用输入调用的,但是当我们编辑它时,我们将它移到堆栈上,现在它指向k++\0back++k\0whileprintfbackH++\0再次,所以第二次printf运行,现在只剩下第一次back调用,猜猜k指向哪里?对,它指向H(不要忘记++),所以再次while执行,但输入是++kwhich 反过来\0,所以新调用的back立即返回 a printf,我们再次处于第一次back调用但这次指向\0另一个printf,我们完成,
为了更好地理解序列,我建议运行此代码

#include <stdio.h>
#include <stdlib.h>
void back(char*k)
{
    printf("%c",'O');

    while(*k) //->not work??
    {
        back(++k);
    }

    printf("%c",'f');
}

int main()
{
    char k[]="he";
    back(k);
    return 0;
} 

预期的输出是OOOffOff


推荐阅读