2016-05-02 4 views
-7

Почему эта программа печатает "olleH"?Почему этот код печатает "olleH"?

Кажется, что эта программа будет печатать буквально ничего - но я, похоже, не понимаю, как работает рекурсия.

#include "stdafx.h" 
#include <iostream> 
#include <string> 

using namespace std; 

void function(string, int, int); 

int main() 
{ 
    string mystr = "Hello"; 
    cout << mystr << endl; 
    function(mystr, 0, mystr.size()); 

    system("pause"); 
    return 0; 
} 

void function(string str, int pos, int size) 
{ 
    if (pos < size) 
    { 
     cout << str[pos]; 
     function(str, pos + 1, size); 
    } 
} 
+0

Это ничего не возвращает, потому что тип возврата является 'void'. – immibis

+0

Проследите через код. Я в тебя верю. – karina

+0

В коде нет инструкции «cout». Даже если они были, один или два, они тоже ничего не «возвращают». –

ответ

2

две вещи: во-первых, терминология: функция декларации вы написали возвращает void и не string, но на самом деле напечатать строку. Во-вторых, код, который вы опубликовали, печатает «Hello», когда я запускаю его. Я собираюсь предположить, что ваш вопрос касается того, почему «olleH» печатается, если изменить порядок этих двух линий в function():

cout << str[pos]; //prints "Hello" 
function(str, pos + 1, size); 

по сравнению с:

function(str, pos + 1, size);//prints "olleH" 
cout << str[pos]; 

Это, как вы - заявил он, - это рекурсия. Чтобы понять это, вам нужно иметь в виду порядок, в котором вызываются функции, и обратный порядок, в котором они возвращаются, передавая управление вызываемой им функции. Первый вызов function() с pos в начале строки возвращает последний, а рекурсивные вызовы возвращаются до того, как это произойдет, с самым внутренним вызовом функции с pos в конце строки, которая будет полностью запущена. (Это связано с тем, что рекурсивный вызов выполняется только if (pos < size), и это ограничение очень важно для предотвращения бесконечного цикла). Таким образом, при первом вызове function() св начале, если он записывает первый символ перед вызовом function(), чтобы записать оставшуюся часть строки, строка будет в порядке. Если вы напишете первый символ после написания остальной части строки, то он будет в обратном порядке, как в двух разных случаях.

Смежные вопросы