Я думаю, что лучший способ объяснить это - показать, как я бы переписал функцию, чтобы она была более читабельной. Каждый из следующих фрагментов будет иметь вывод, идентичный исходному коду (при условии, что i == 1 при первом вызове recur ())
Во-первых, давайте возьмем оператор постинкремента из условия, потому что я думаю, что это сбивает с толку. Этот код эквивалентен:
void recur() {
std::cout << "\nvalue of i above while loop : " << i << std::endl;
while(i < 10){
i++;
recur();
std::cout << "statement just after the recursive call to tester and here the value of i is :" << i << std::endl;
}
i++;
}
Обратите внимание, как в конце находится i ++. Это связано с тем, что в исходном коде я буду увеличивать себя в условии (i ++ <10), даже если условие не оценивается как true и не входит в цикл. </p>
Далее, вы можете сортировать повторяемость, многократно вставляя код. Я также отслеживаю значение i каждый раз, когда его значение изменяется.
void recur() {
std::cout << "\nvalue of i above while loop : " << i << std::endl;
while(i < 10){
i++; //i == 2
std::cout << "\nvalue of i above while loop : " << i << std::endl;
while(i < 10){
i++; //i == 3
std::cout << "\nvalue of i above while loop : " << i << std::endl;
while(i < 10){
i++; //i ==4
std::cout << "\nvalue of i above while loop : " << i << std::endl;
while(i < 10){
i++; //i == 5
std::cout << "\nvalue of i above while loop : " << i << std::endl;
while(i < 10){
i++; //i == 6
std::cout << "\nvalue of i above while loop : " << i << std::endl;
while(i < 10){
i++; //i == 7
std::cout << "\nvalue of i above while loop : " << i << std::endl;
while(i < 10){
i++; //i == 8
std::cout << "\nvalue of i above while loop : " << i << std::endl;
while(i < 10){
i++; //i == 9
std::cout << "\nvalue of i above while loop : " << i << std::endl;
while(i < 10){
i++; //i == 10
std::cout << "\nvalue of i above while loop : " << i << std::endl;
while(i < 10){//this doesn't evaluate to true since i == 10
//we stop unrolling here because the interior of this loop won't be executed anyway
}
i++; // i == 11
std::cout << "statement just after the recursive call to tester and here the value of i is :" << i << std::endl;
}
i++;
std::cout << "statement just after the recursive call to tester and here the value of i is :" << i << std::endl;
}
i++;
std::cout << "statement just after the recursive call to tester and here the value of i is :" << i << std::endl;
}
i++;
std::cout << "statement just after the recursive call to tester and here the value of i is :" << i << std::endl;
}
i++;
std::cout << "statement just after the recursive call to tester and here the value of i is :" << i << std::endl;
}
i++;
std::cout << "statement just after the recursive call to tester and here the value of i is :" << i << std::endl;
}
i++;
std::cout << "statement just after the recursive call to tester and here the value of i is :" << i << std::endl;
}
i++;
std::cout << "statement just after the recursive call to tester and here the value of i is :" << i << std::endl;
}
i++;
std::cout << "statement just after the recursive call to tester and here the value of i is :" << i << std::endl;
}
i++;
}
Обратите внимание, что каждый цикл while выполняется только один раз - к тому времени, когда первый цикл while завершается в первый раз, i больше десяти, поэтому цикл не будет введен во второй раз. Имея это в виду, мы можем полностью избавиться от времен и сохранить некоторые отступы.
void recur() {
std::cout << "\nvalue of i above while loop : " << i << std::endl;
i++; //i == 2
std::cout << "\nvalue of i above while loop : " << i << std::endl;
i++; //i == 3
std::cout << "\nvalue of i above while loop : " << i << std::endl;
i++; //i ==4
std::cout << "\nvalue of i above while loop : " << i << std::endl;
i++; //i == 5
std::cout << "\nvalue of i above while loop : " << i << std::endl;
i++; //i == 6
std::cout << "\nvalue of i above while loop : " << i << std::endl;
i++; //i == 7
std::cout << "\nvalue of i above while loop : " << i << std::endl;
i++; //i == 8
std::cout << "\nvalue of i above while loop : " << i << std::endl;
i++; //i == 9
std::cout << "\nvalue of i above while loop : " << i << std::endl;
i++; //i == 10
std::cout << "\nvalue of i above while loop : " << i << std::endl;
i++; // i == 11
std::cout << "statement just after the recursive call to tester and here the value of i is :" << i << std::endl;
i++;
std::cout << "statement just after the recursive call to tester and here the value of i is :" << i << std::endl;
i++;
std::cout << "statement just after the recursive call to tester and here the value of i is :" << i << std::endl;
i++;
std::cout << "statement just after the recursive call to tester and here the value of i is :" << i << std::endl;
i++;
std::cout << "statement just after the recursive call to tester and here the value of i is :" << i << std::endl;
i++;
std::cout << "statement just after the recursive call to tester and here the value of i is :" << i << std::endl;
i++;
std::cout << "statement just after the recursive call to tester and here the value of i is :" << i << std::endl;
i++;
std::cout << "statement just after the recursive call to tester and here the value of i is :" << i << std::endl;
i++;
std::cout << "statement just after the recursive call to tester and here the value of i is :" << i << std::endl;
i++;
}
Можно также оптимизировать некоторые из этих повторяющихся утверждений ...
void recur(){
for(int x = 0; x < 10; x++){
std::cout << "\nvalue of i above while loop : " << i << std::endl;
i++;
}
for(int x = 0; x < 9; x++){
std::cout << "statement just after the recursive call to tester and here the value of i is :" << i << std::endl;
i++;
}
}
Теперь совершенно очевидно, что первое утверждение печатается само для i = 1 до 10, а второе от i = 11 до 19.