使用while和if递归打印字符

时间:2019-01-05 07:53:23

标签: c++ recursion

我是新手,请尝试了解递归的工作原理。 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;
}

1 个答案:

答案 0 :(得分:1)

关于第一个问题,为什么while不起作用,让我们看看在这种情况下代码如何运行
从一个简单的示例开始,可以说我们的char[]仅是GH\0, 好吧,这有点难以解释,但让我们尝试一下
首先调用back,然后k指向G,因为它不是\0,再次调用back,其中k为{{ 1}},因此它指向'H',而它又不是++,因此\0被另一个back调用,其中这次是++k,所以{ {1}}未执行,\0完成了工作,现在执行返回到第二个while调用,在该调用中使用printf输入,但正如我们back编辑它,我们将其移到堆栈上,现在它再次指向H,因此运行第二个++,现在仅剩下第一个\0调用,猜猜printf的位置指向?正确,它指向back(不要忘记k),因此再次执行H,但是输入是++,而输入依次是while,因此新的++k立即返回一个\0,我们再次进入第一个back调用,但是这次是指向printf,因此另一个指向back,我们完成了,
为了更好地理解序列,我建议运行这段代码

\0

预期产量为printf