Итак, мой друг берет один из своих первых классов CS и упоминает, что он использует рекурсию в своей первой программе. Он отправляет мне код ниже. Сразу после битвы я заметил, что он не улавливает возвращаемую стоимость своего рекурсивного звонка, и я предположил, что это не сработает. Но он настаивает на том, что он работает, поэтому я пробую его программу, и, к моему удивлению, он функционирует точно так, как ожидалось. Игнорируя тот факт, что это тупой способ добраться из точки А в точку Б, почему это работает?Почему эта рекурсивная функция работает?
Я играл с тем, что он послал мне, и добавил cout
после утверждения if. Кроме того, первый фрагмент кода и второй фрагмент идентичны.
Если я введите следующее для первой программы, вот что я получаю ...
Введите номер: 10
Вы вошли: 10 Правильно ли это? (Y/N): N
Введите номер: 12
Вы ввели: 12 Правильно ли это? (Y/N): Y
основной() = 12
И потом, если я делаю то же самое со второй программой, вот что я получаю ...
Введите Номер: 10
Вы ввели: 10 Правильно ли это? (Y/N): N
Введите номер: 12
Вы ввели: 12 Правильно ли это? (Y/N): Y
основной() = 6300096
Что происходит !?
#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;
int getNum()
{
cout << "Enter a Number: ";
int x;
cin >> x;
cin.ignore(100, '\n');
while(x < 0) {
cout << "Please enter amount greater than 0: ";
cin >> x;
cin.ignore(100, '\n');
}
cout << "You entered: " << x << " Is this correct? (Y/N): ";
char response;
cin >> response;
cin.ignore(100, '\n');
if (response != 'Y') {
getNum();
} else {
return x;
}
}
int main() {
cout << "\nmain() = " << getNum() << endl;
return 0;
}
Единственная разница между верхней и нижней является cout
заявление после того, если заявление.
#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;
int getNum()
{
cout << "Enter a Number: ";
int x;
cin >> x;
cin.ignore(100, '\n');
while(x < 0) {
cout << "Please enter amount greater than 0: ";
cin >> x;
cin.ignore(100, '\n');
}
cout << "You entered: " << x << " Is this correct? (Y/N): ";
char response;
cin >> response;
cin.ignore(100, '\n');
if (response != 'Y') {
getNum();
} else {
return x;
}
cout << "returning... " << x;
}
int main() {
cout << "\nmain() = " << getNum() << endl;
return 0;
}
В 'if (response! = 'Y')', не следует ли вам возвращать getNum(); '? Когда вы пишете это так, если 'response! = 'Y'', вы никогда ничего не возвращаете, поэтому тот факт, что ваша первая программа работает, - это в основном удача. – tforgione
Да, вы правы, но я спрашиваю о части удачи. –
Мой плохой, не понял ваш вопрос. – tforgione