Функция должна вернуть 1, но возвращает 0 - PullRequest
0 голосов
/ 04 сентября 2018

Следующий код принимает входные данные x и y, а затем вызывает функцию. Предполагается, что функция будет вызываться 3 раза, и в этом случае она вернется 1. Если, однако, значения x или y упадут до очень низких уровней, функция не будет вызываться 3 раза, и в этом случае она вернет 0.

Мой ввод 3, 22. Я вижу, что значение t становится 3 после того, как функция была вызвана 3 раза, но она возвращает значение 0 вместо 1 (как видно из значения i). Может кто-нибудь объяснить, почему это происходит?

PS: некоторые разделы кода были удалены, поэтому мы можем сосредоточиться только на соответствующих частях.

#include <iostream>
using namespace std;

int turn_yeh(int &x, int &y)
{
    static int t = 0;

    cout << "t : " << t << " x: "<< x<< " y : " << y<<endl;

    if (t != 0 && t% 3 == 0) return 1;
    if(x!= 0 && t!= 2){x--; t++; turn_yeh(x,y);}
    else if(y >=10 && t!=2){y -= 10*t; turn_yeh(x,y);}
    if( y >= 2 && t == 2){y -= 2; t++; turn_yeh(x,y);}
    else return 0;
}


int main()
{
    int x, y;
    cin >> x >> y;

    int i = 1;
    while (1)
    {
        i = turn_yeh(x ,y);
        cout << "i : " << i << endl;
        if (i == 0)
        {
            cout << "Hanako";
            return 0;
        }

    }
}

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Если бы вы выписали скобки, используя одно из установленных соглашений, вы бы быстро обнаружили, что не существует явного значения return во всех путях управления программой.

Это означает, что поведение вашего кода undefined . (Обратите внимание, что main является исключением из этого правила, с неявным добавлением операторов return 0;.)

Вы, вероятно, хотите написать return turn_yeh(x, y) на пропущенных ветвях.

Ссылка: https://en.wikipedia.org/wiki/Indentation_style

0 голосов
/ 04 сентября 2018

Ваша функция, вероятно, нуждается в return результате рекурсивного вызова:

int turn_yeh(int &x, int &y)
{
    static int t = 0;

    cout << "t : " << t << " x: "<< x<< " y : " << y<<endl;

    if (t != 0 && t% 3 == 0) return 1;
    if(x!= 0 && t!= 2){x--; t++; return turn_yeh(x,y);}
    else if(y >=10 && t!=2){y -= 10*t; return turn_yeh(x,y);}
    if( y >= 2 && t == 2){y -= 2; t++; return turn_yeh(x,y);}
    else return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...