#include <iostream>
using std::cout;
using std::cin;
using std::endl;
bool winning(int x, int y, int z)
//x,y,z = number of stones in the 3 piles.
//returns true if this is a winning position.
{
if (x==0 && y==0 && z==0) return false; // base case
for (int i=1; i<=x; ++i) // Pick i stones from pile 1
if (!winning(x-i, y, z)) return true; // if a losing next state is found
for (int i=1; i<=y; ++i) // Pick i stones from pile 2
if (!winning(x, y-i, z)) return true; // if a losing next state is found
for (int i=1; i<=z; ++i) // Pick i stones from pile 3
if (!winning(x, y, z-i)) return true; // if a losing next state is found
return false; // if all next states are winning
}
int main() {
int x,y,z;
cout << "Give the number of stones in the 3 piles: ";
cin >> x >> y >> z;
if (winning(x,y,z)) cout << "Wins." << endl;
else cout << "Loses." << endl;
}
Что на самом деле делает код? Каждый цикл в конечном итоге заканчивается в точках x=0, y=0 и z=0. Затем, как программа различает разные значения. (Возможно, я не понял использования некоторых общих команд, таких как «возврат», пожалуйста, объясните и это.)
что такое «простопп»? Называть main_program
«простым» несколько странно. Было бы просто показать реальный код, а не прятать его за глупыми макросами.
в любом случае вы спрашиваете нас, что делает код, но в то же время мы не должны обращать внимание на синтаксис, который не соответствует C++. Мы не сможем сказать вам, что делает код, пока вы не покажете нам этот заголовок. Я придираюсь к деталям, но детали имеют значение.
@ 463035818_is_not_an_ai это пакет, установленный для обучения первокурсников C++.
проблема в том, что он учит вас не-С++. main_program
это не C++. Отсутствие правильных заголовков — это не C++.
Итак... Вы хотите узнать Тайну Нима... Это Мыши.
@ 463035818_is_not_an_ai Да, это будет int main(). Кроме этого, все так, как должно быть. Пожалуйста, сосредоточьтесь на его семантике.
«Каждый цикл в конечном итоге заканчивается в точках x=0, y=0 и z=0». откуда вы знаете? Я так не думаю. Вам следует использовать отладчик, чтобы увидеть, что на самом деле происходит.
Я вообще не понимаю вопроса "как программа различает разные значения". какие разные значения?
Я имею в виду серьезно. После того, как я раскритиковал все, что нашел, что можно покритиковать по этому вопросу, я теперь нахожусь в режиме помощи. И лучшая помощь, которую вы можете получить, — это ваш отладчик. Кто-то другой, объясняющий вам, что делает код, только украдет у вас прекрасную возможность научиться использовать отладчик.
Если вы не можете использовать отладчик, потому что используемая вами система не позволяет этого, скопируйте код в систему, которая позволяет вам использовать отладчик, и используйте отладчик. Если вы ВСЕ ЕЩЕ не можете использовать отладчик, добавьте в код больше операторов печати, чтобы предоставить вам диагностическую информацию, которую вам предоставил бы отладчик. Пара cout << x << ','<< y << ','<< z << '\n';
в стратегических точках winning
расскажет вам почти все, что вы хотите знать.
@KeShAw «Так что не обращайте внимания на синтаксис». -- Не обращая внимания на то, что вам следует делать, подумайте об этом с дипломатическим складом ума. С точки зрения читателя, синтаксис ненадежен, и нет никакой мотивации его адаптировать, учитывая, что читатели — добровольцы. Голосование «против» или «закрыто» — это легкая реакция на шаткость. Правильно это или нет, но такое случается. С другой стороны, вы знаете, что синтаксис шаткий. Вы знаете, что люди будут против этого. Вы даже знаете, как сделать синтаксис не шатким. Однако вы не хотите его чистить (и тестировать код, чтобы убедиться, что он по-прежнему ведет себя так же). Почему? Вам нужен плохо принятый вопрос?
Обоснование кода следующее:
Если у вас остались вопросы, вам следует отследить код, выполнив его вручную. Выясните, что он делает с winning(0, 1, 0)
и с winning(1, 1, 1)
.
Это C++ с добавленным пакетом simplecpp. Так что не обращайте внимания на синтаксис.