Рекурсивные функции с || оператор? - PullRequest
0 голосов
/ 07 мая 2020

Итак, я возился с операторами || и && с return. Я пришел к выводу, сравнивая int, например, return 1 || 0; return 0 || 0;, что программа возвращает 1 или 0 в случае функции int и истину или ложь в случае bool функций после сравнения values.

Теперь я писал код для нахождения суммы пути к заданному значению с использованием реализации деревьев.

bool HasPathSum(ds::sn::BNode<int>* root, int value)
{
    if (!root && !value)
    {
        return true;
    }
    else if(root)
    {
        return HasPathSum(root->left, value - root->data)
            || HasPathSum(root->right, value - root->data);
    }
    return false;
}

Мне удалось написать его после массивных возня. Для рекурсии я делал

HasPathSum(root->left, value - root->data);
return HasPathSum(root->right, value - root->data);

, чтобы исследовать все пути, но это было не совсем нормально, потому что, если сумма путей оставалась в левой части, она делала go истинным, но в конечном итоге возвращалось false. Я подумал, что мне придется написать рекурсивное определение в одной строке, чтобы оно работало, и написал || просто в качестве эксперимента, и мне пришло в голову, что это действительно сработало. Я написал std::cout << value << " "; вверху оператора if, чтобы увидеть, что происходит, и он делает то, что должен делать, и останавливается, как только путь был найден.

Это все, что я пробовал, но Я не могу понять, как работает рекурсивная функция с || или будет работать, если дан &&.

Если кто-то опытный может дать объяснение! :)

1 Ответ

1 голос
/ 07 мая 2020

operator || и operator && происходит короткое замыкание, поэтому второй операнд может не оцениваться в зависимости от первого.

bool b = f() || g(); в основном эквивалентно

bool b = f();
if (b == false) b = g();

bool b = f() && g(); в основном эквивалентно

bool b = f();
if (b == true) b = g();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...