Самый большой общий делитель в R с использованием базового пакета без if, else, ifelse или loop вообще [duplicate]

При использовании strotime() вам необходимо убедиться, что вы используете допустимый формат даты и времени . В противном случае strtotime() вернет false или , вы получите неожиданное значение.

Даты, в которых используется формат XX / XX / XXXX, считаются в формате США, что означает первый две цифры представляют месяц, следующие две цифры представляют день месяца, а последние четыре цифры представляют год. Когда используются тире, даты предполагаются в европейском формате. Например:

04/18/2017 = April 18, 2017
12/18/2017 = December 18, 2017
18-04-2017 = April 18, 2017
18-12-2017 = December 18, 2017

Если вы случайно переключили день и месяц, strtotime() вернет false, поскольку дата недействительна.

18/04/2017 // error
18/12/2017 // error
04-18-2018 // error
12-18-2017 // error

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

04/12/2017 = April 12, 2017
12/04/2017 = December 4, 2017
04-12-2017 = December 4, 2017
12-04-2017 = April 12, 2017

В приведенных выше примерах, переключая день и месяц, мы по-прежнему получаем действительные даты, которые могут привести к неожиданным результатам в вашем приложении. Чтобы решить эти потенциальные проблемы, рекомендуется использовать DateTime::createFromFormat() , чтобы проанализировать объявление даты, возвратить объект DateTime() , из которого вы можете получить отметку времени Unix , преобразовать дату в другой формат или использовать ее для сравнения с другими объектами DateTime.

// Parse US date format
$date1 = DateTime::createFromFormat('m/d/Y', '04/18/2017');

// Get Unix timestamp of 1493581268
$timestamp = $date1->getTimestamp();

// Parse European date format
$date2 = DateTime::createFromFormat('d-m-Y', ''18-04-2017);

// Get MySQL format (ISO-8601) of 2017-04-18
$mysqlDate = $date2->format('Y-m-d');

См. также:


В вашем конкретном случае следующий код будет работать:

$date = $date1 = DateTime::createFromFormat('m/d/Y', '20/02/2000');
$D->query = $date->format('Y-m-d'); // 2000-02-20

12
задан Reanimation 1 February 2014 в 23:41
поделиться

4 ответа

Используя инструкцию «без циклов» или «if», буквально здесь рекурсивная версия, использующая ifelse:

gcd <- function(x,y) {
  r <- x%%y;
  return(ifelse(r, gcd(y, r), y))
}

. Ее можно не ожидать, но это фактически векторизация :

gcd(c(1000, 10), c(15, 10))
[1]  5 10

Решение с использованием if не будет обрабатывать векторы длиной больше 1.

16
ответ дан Matthew Lundberg 23 August 2018 в 01:34
поделиться
  • 1
    О, хорошо: D Итак, я думаю, это можно сделать. Мне было интересно об этом весь день. Спасибо, что нашли время для публикации. Сейчас у меня будет игра. Благодарю. – Reanimation 2 February 2014 в 00:00
  • 2
    Это похоже на обман во многих отношениях. – Matthew Lundberg 2 February 2014 в 00:03
  • 3
    Спасибо за сообщение: D – Reanimation 2 February 2014 в 16:26
  • 4
    Это довольно ingenius – David Arenburg 14 August 2016 в 14:46
  • 5
    Небольшая настройка: назначение не является необходимым, и безопаснее не переписывать явное имя функции. Таким образом: gcd <- function(x, y) ifelse(y, Recall(y, x %% y), x). – egnha 4 August 2018 в 11:23

Это легко сделать с помощью нескольких модульных операций. К сожалению, я оставил свой персональный код gcd на другой машине (в далекой галактике), но вы можете найти источник в пакетах numbers или pracma.

Кстати, вот хороший способ найти существующий код: library(sos); ???gcd

0
ответ дан Carl Witthoft 23 August 2018 в 01:34
поделиться

Уменьшение GCD для двух целых чисел позволяет вам вычислить GCD для любой последовательности целых чисел (отсортировано или нет):

gcd2 <- function(a, b) {
  if (b == 0) a else Recall(b, a %% b)
}

gcd <- function(...) Reduce(gcd2, c(...))
0
ответ дан egnha 23 August 2018 в 01:34
поделиться

Вы можете решить эту проблему рекурсивно.

euclids <- function(x,y){
        theMax = max(x,y)
        theMin = min(x,y)

        if (theMax == theMin) return (theMax)
        else return (euclids(theMin, theMax-theMin))
}
2
ответ дан skklogw7 23 August 2018 в 01:34
поделиться
  • 1
    Это звучит как повторение этого существующего ответа. Прочитайте это как ответить для предоставления качественного ответа. – thewaywewere 26 May 2017 в 02:29
  • 2
    К сожалению, здесь только начинается. Благодаря! – skklogw7 26 May 2017 в 02:47
  • 3
    Это также использует рекурсию, но без умного использования ifelse, показанного @Matthew Lundberg. Легче читать, но не имеет эффекта Вау Матвея. – PatrickT 19 December 2017 в 10:27
  • 4
    @ skklogw7 Этот ответ дает другой аспект или способ делать что-то, поэтому я не согласен с комментарием. Мы приветствуем различные ответы, иначе StackExchange не будет их поддерживать и не будет поддерживать голосование. – Jonathan Komar 28 May 2018 в 10:06
Другие вопросы по тегам:

Похожие вопросы: