Нечетный вопрос, касающийся Эйлера проекта 72 (шепелявость)

Я смог отправить его, преобразовав их в строку. ES интерпретирует типы данных с умом.

df.rdd.map(row => {
      var m = Map[String, Any]()
      (0 until len).foreach(i => {
        m += (schema.fields(i).name -> row.getAs[String](i))
      })
      m
    }).saveToEs("path")
5
задан Rainer Joswig 22 January 2015 в 16:41
поделиться

4 ответа

Вероятно, переполнение стека (heh).

0
ответ дан 13 December 2019 в 22:18
поделиться

Это поведение намекает на недостающую оптимизацию последнего вызова, так, чтобы Ваша рекурсия унесла стек. Возможная причина - то, что Вы декламировали отладку оптимизации.

Между прочим, Вы не должны выполнять явный вызов к return-from. С тех пор sum символ самооценки, можно изменить эту строку

(return-from count-reduced-fractions sum)

кому:

sum

править: Объяснение предложенного изменения: "сумма" оценивает к ее собственному значению, которое становится возвращаемым значением, "если" оператор, который (так как это - последний оператор в defun) становится возвращаемым значением функции.

править: Объяснение декламируемой оптимизации: Вы могли добавить следующее к своему верхнему уровню:

(declaim (optimize (speed 3)
                   (debug 0)))

или используйте то же, но с declare вместо declaim как первый оператор в Вашей функции. Вы могли также попробовать (расположите с интервалами 3), и (безопасность 0), если она не работает.

Оптимизация последнего вызова означает, что вызов функции, возвращаемое значение которого непосредственно возвращается, переводится в замену кадра на стеке (вместо того, чтобы сложить), эффективно "сглаживание" рекурсивной функции звонит в цикл, и устраняя вызовы рекурсивной функции. Это делает отладку немного тяжелее, потому что нет никаких вызовов функции, где Вы ожидаете их, resp. Вы не знают, как "глубоко" в рекурсию ошибка происходит (так же, как если бы Вы записали цикл для начала). Ваша среда могла бы сделать некоторые выступления по умолчанию, которые необходимо переопределить для включения TCO.

править: Просто пересмотрев этот вопрос, что g? Я думаю, что Вы на самом деле хотите

(let ((g (gcd n d)))
  ;; ...
  )
6
ответ дан 13 December 2019 в 22:18
поделиться

Как стиль, Вы могли сделать d и сумму дополнительными.

(defun test (n &optional (d n) (sum 0)) .. )
1
ответ дан 13 December 2019 в 22:18
поделиться

Мое предположение - то, что существует встроенный предел глубины стека с lispbox. Так как язык Common LISP не гарантирует, что рекурсивные функции хвоста используют постоянное стековое пространство, возможно, что каждый вызов count-reduced-fractions добавляет другой слой на стеке.

Между прочим, SBCL выполняет этот алгоритм без проблемы.

* (count-reduced-fractions 53 53 0)
881

* (count-reduced-fractions 100 100 0)
3043
3
ответ дан 13 December 2019 в 22:18
поделиться