Простой перебор кода


Хорошо ли это или его можно улучшить? Программа должна возвратиться двух переменных до этой логической операции является истина: A и B.

#include <stdio.h>
#include <stdbool.h>

bool perm(bool, bool);

int main(){

    bool x = false;
    bool y = false;

/*  RECURSIVE SOLUTION  */

    if(perm(x,y) == true){
        puts("DONE\n");
    }

    puts("\n\n");


/* ITERATIVE SOLUTION*/


    for(int cnt = 0; cnt < 2; cnt++){
        x = cnt;
        for(int cnt_2 = 0; cnt_2 < 2; cnt_2++){
            y = cnt_2;
            if( (x & y) == true){
                printf("%d ^ %d =  TRUE\n", x,y);
                puts("DONE");
                return 0;
            }
            printf("%d ^ %d =  FALSE\n", x,y);
        }
    }

    puts("NOTHING");

    return 0;
}


bool perm(bool x, bool y){

    const bool c_x = x;
    const bool c_y = y;

    printf("%d ^ %d  = %d\n", c_x, c_y, c_x&c_y);

    if(x == true){ return x;}
    if(y == true){ return y;}

    perm(y+1,x);

    return ( (x & y) == true) ? true : perm(x+1,y); 
}


117
1
задан 1 марта 2018 в 03:03 Источник Поделиться
Комментарии
1 ответ

Я найти этот код довольно странным. Я думаю, что есть ряд проблем, вы можете работать, который я опишу ниже.

Функции

Вы ставите рекурсивную версию функции, называется perm() который является хорошей идеей. Я бы сделал то же самое с итеративной версии. Таким образом, ваш main() функция становится более ясным. Я бы переименовать рекурсивный один recursive_perm() и сделать новый iterative_perm(). Тогда ваш main() становится:

int main(){

bool x = false;
bool y = false;

if(recursive_perm(x,y) == true){
puts("DONE\n");
}

puts("\n\n");

x = false;
y = false;
if(iterative_perm(x,y) == true) {
puts("DONE\n");
}

puts("NOTHING");

return 0;
}

Теперь вам не нужны комментарии, заявив, что "рекурсивное решение" и "итерационное решение", потому что очевидно из названия.

Исправить Вашу Рекурсию

Вы рекурсивной версии не сделать то же самое, как ваш итерационный вариант. На самом деле, он делает очень странные вещи. Почему ты копируешь входных переменных в const члены только их распечатать? printf() берет свои аргументы по значению, поэтому их печать не изменит их значений локально.

Также, почему вы печать логическое XOR при выполнении логических и? В ^ оператор исключающее ИЛИ В C на основе языка. Ваше заявление для печати о том, что значение x эксклюзив-или-ED с Y равно значению X логически дополняется у.

Далее, Почему вы звоните perm(y+1,x); перед return заявление? Вы ничего не делаете с возвращаемым значением, так что никакой работы она делает, это вообще полезно. Выкинуть результаты (хотя у него есть побочный эффект печати некоторые вещи).

Что делают эти неправильные строки выполнить?

if(x == true){ return x;}
if(y == true){ return y;}

Они появляются, чтобы проверить, если только 1 из значений true, а затем вернет true, игнорируя другие параметры. Поэтому он фактически не вычисления перестановок, которые вы хотите рассчитать.

Делаем сложение по bool ценности не просто читать. Я бы не рекомендовал делать это в будущем. Вы можете легко переключаться логическое значение true для false путем добавления его ! оператора. Или изменить функцию, чтобы взять int вместо bool как вы сделали с итеративной версии.

Тестирование bool

В общем, она считается лучше, чтобы напрямую проверить bool переменной в if заявление, а не сравнивая его с true или false делая это:

bool x = true;
bool y = false;
if (x) {
// x was true, do something here
}
if (!y) {
// y was false, do something here
}

Что означает возвращаемое значение представляет?

Что означает возвращаемое значение вашего perm() функция представляете? Если все вы хотите сделать, это перебрать все возможные перестановки, это не для меня ясно, что он должен возвращать значение. Читая это, я предполагаю, что если это правильно, то переберем все значения, в противном случае он бы не вернулся. Если вы хотите знать, какая комбинация возвращала True, вы, вероятно, следует возвращать struct содержит 2 значения, показывающие окончательной комбинации.

1
ответ дан 1 марта 2018 в 04:03 Источник Поделиться