рекурсивно печатать символ используя while и if - PullRequest
0 голосов
/ 05 января 2019

Я новичок и пытаюсь понять, как работает рекурсия. Чем отличается использование 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;
}

1 Ответ

0 голосов
/ 05 января 2019

О вашем первом вопросе о том, почему while не работает, давайте посмотрим, как работает код в этом случае
Начнем с простого примера. Допустим, что для простоты наш char[] равен GH\0, Ну, это немного сложно объяснить, но давайте попробуем
сначала вызывается back, а k указывает на G, так как он не \0, back вызывается снова с k, являющимся ++ ed, поэтому он указывает на 'H' и снова это не \0, поэтому back вызывается с другим ++k, в котором это время равно \0, поэтому while не выполняется и printf выполняет свою работу, теперь выполнение возвращается ко второму back вызов, где он был вызван с H вводом, но когда мы ++ его редактировали, мы переместили его в стек и теперь он снова указывает на \0, поэтому второй printf запускается, теперь только первый back вызов остался, угадайте, куда k указывает? верно, он указывает на H (не забывайте ++), поэтому снова выполняется while, но ввод ++k, что, в свою очередь, \0, поэтому новый вызываемый back немедленно возвращается с 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

...