Решая эту функцию идентификации? - PullRequest
0 голосов
/ 26 июня 2018

Рассмотрим следующее определение функции C

int Trial (int a, int b, int c)
{
    if ((a>=b) && (c< b)) return b;

    else if (a>=b) return Trial(a, c, b);

    else return Trial(b, a, c);
}

Функциональное испытание:

a) Находит максимум a, b и c

b) Находит минимум a, b и c

c) Находит среднее число a, b, c

d) Ничего из вышеперечисленного

======================================================================

Мой вывод - я взял a = 1 b = 2 c = 3 и получил ответ как 2, который является средним элементом,но это неправильный ответ, и правильный ответ - вариант (d)

Итак, где я ошибаюсь?

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

До C11 поведение кода undefined для случая, когда a, b и c все равны.(Все остальные случаи могут быть проверены тривиально с помощью отладчика или устаревшего анализа пера и бумаги.)

Это происходит потому, что в такой ситуации код вызывает себя до бесконечности.И бесконечный цикл без ввода или вывода не был определен в C до, но не включая C11.

По моему мнению, дополнительные предложения, добавленные в C11 в попытке определить это, добавляют дополнительную путаницу в этом случае.См. Есть время (1);неопределенное поведение в C?

Я считаю, что компилятор может (теоретически) оптимизировать программу до хвостовой рекурсии ;таким образом, устраняя любые проблемы, связанные с переполнением стека, например.Это может сделать это довольно тривиально, если программа будет преобразована в

int Trial (int a, int b, int c)
{
    if (a >= b && c < b) return b;
    return Trial(a >= b ? a : b, a >= b ? c : a, a >= b ? b : c);
}
0 голосов
/ 26 июня 2018

Этот код даст StackOverflowError для следующих значений a, b, c (1,2,1), (1,1,2), (2,1,1), (2,2,2) для любого числав приведенном выше примере, например (1,2,1) a == c и b> a и b> c, это приведет к ошибке.

Как вы упомянули для ввода 1,2,3, вы получите значение 2 каквыход.Поэтому вариант А «максимум» и В «минимум» неверен.Вариант 3 кажется правильным для входов, но код не будет работать для шаблона входов, упомянутых выше.Поэтому правильным ответом должен быть вариант «Д» Не из вышеперечисленных.

0 голосов
/ 26 июня 2018

Эта функция вызовет переполнение стека из-за бесконечной рекурсии в случае, когда a = b = c, например: (1,1,1).Рассмотрение всех граничных случаев было бы неотъемлемой частью решения задачи в MCQ, подобных этому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...