проверить, не являются ли n чисел нечетными или четными, используя только операции - + * - PullRequest
0 голосов
/ 19 мая 2018

есть способ проверить N чисел, если они все нечетные или четные без использования функции мода% ??? , я могу использовать только функции - + *.

1 Ответ

0 голосов
/ 19 мая 2018

Таким образом, вы можете использовать сложение, вычитание, умножение и сравнение.Я также предполагаю, что вы можете определять функции, и ваша цель состоит в том, чтобы определить две функции:

  • Функция evenList принимает список чисел и возвращает true, если (если-и-только-если) список содержит только четные числа.
  • Функция oddList принимает список чисел и возвращает значение true, если список содержит только нечетные числа.

Сначала давайте определим even функция, которая принимает одно число и возвращает истину, если ввод четен:

even(i) = if (i == 0) true
          else if (i == 1) false
          else if (i > 1) even(i - 2)
          else /* i < 0 */ even(i + 2)

Мы можем определить odd функцию в терминах even:

odd(i) = even(i+1)

Мызатем можно просто определить evenList рекурсивно:

evenList(nil) = true
eventList(x : xs) = even(x) & evenList(xs)

(я использую x : xs для обозначения списка, первый элемент которого равен x, а остаток - xs. Я используюnil означает пустой список.)

Но, возможно, вам не разрешено использовать логический оператор &.Что мы можем сделать вместо этого?

Рассмотрим умножение двух чисел, i и j.Какой паритет является результатом, основанным на паритете i и j?(Четность означает странность или равномерность.)

  • even(i) & even(j) -> even(i*j)
  • even(i) & odd(j) -> even(i*j)
  • odd(i) & even(j) -> even(i*j)
  • odd(i) & odd(j) -> odd(i*j)

(я использую -> для обозначения «подразумевает».) Другими словами, i * j нечетно, если i нечетно, а j нечетно.

Итак, если вы умножитевсе ваши входные числа вместе, и произведение нечетное, тогда все входные данные нечетные.Итак, мы определим функцию product:

product(nil) = 1
product(x : xs) = x * product(xs)

И затем мы можем определить oddList следующим образом:

oddList(xs) = odd(product(xs))

Но как узнать, все ли входычетное?Даже один четный вход делает продукт четным.

Хитрость заключается в том, чтобы реверсировать четность всех входов, а затем реверсировать четность результата.Вы можете изменить паритет, добавив или вычтя один.Пусть i1 = i + 1 и j1 = j + 1. Тогда:

  • even(i) & even(j) -> odd(i1) & odd(j1) -> odd(i1 * j1) -> even(i1 * j1 + 1)
  • even(i) & odd(j) -> odd(i1) & even(j1) -> even(i1 * j1) -> odd(i1 * j1 + 1)
  • odd(i) & even(j) -> even(i1) & odd(j1) -> even(i1 * j1) -> odd(i1 * j1 + 1)
  • odd(i) & odd(j) -> even(i1) & even(j1) -> even(i1 * j1) -> odd(i1 * j1 + 1)

Другими словами, (i + 1) * (j + 1) + 1 является четным тогда и только тогда, когда i четное, а j четное.

Итак, давайте определим функцию product1, которая возвращает произведение всех своих входов, каждый из которых увеличивается на 1 вначале:

product1(nil) = 1
product1(x : xs) = (x + 1) * product1(xs)

Затем мы можем определить evenList следующим образом:

evenList(xs) = even(1 + product1(xs))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...