Почему моя рекурсия работает в Swift, но не в Python?

Я носитель языка Swift и изо всех сил пытаюсь понять, почему мой алгоритм не работает при переводе на Python.

При запуске в Python он никогда не сбрасывает значение x или y на ноль. Например, ввод 4 должен дать (2, 0), но в версии Python он возвращает (2, 1).

Вот это в Свифте:

func position(from index: Int, gridSize: Int = 32) -> (x: Int, y: Int) {
        
        if index < 0 {
            return (-1, -1)
        }
        
        if gridSize < 1 {
            return (0, 0)
        }
        
        let localIndex = Int((Float(index) / Float(gridSize * gridSize)) * 4)
        let qx = localIndex % 2
        let qy = localIndex / 2
        
        let halfGrid = gridSize / 2
        var x = qx * halfGrid
        var y = qy * halfGrid
        
        let nextIndex = Int(index - localIndex * halfGrid * halfGrid)
        
        let (nextX, nextY) = position(from: nextIndex, gridSize: gridSize / 2)
        
        x += nextX
        y += nextY
        
        return (x, y)
    }

А вот на Питоне:

def posFromIndex(index, grid):

  if index < 0:
    return -1, -1

  if grid < 1:
    return 0, 0

  localIndex = int((index / float(grid * grid)) * 4)
  qx = localIndex % 2
  qy = localIndex / 2

  hg = grid / 2
  x = qx * hg
  y = qy * hg

  nextIndex = int(index - localIndex * hg * hg)

  nextX, nextY = posFromIndex(nextIndex, grid / 2)

  x += nextX
  y += nextY

  print(x, y)
  return int(x), int(y)

Бежать с какими аргументами? Можете ли вы привести полный пример?

a_guest 14.12.2020 17:57

Целочисленное деление // в python 3. Не уверен, что это связано, хотя

Mad Physicist 14.12.2020 17:59

Обратите внимание, что вы можете использовать qy, qx = divmod(localIndex, 2); это будет правильно выполнять целочисленное деление (например, //).

a_guest 14.12.2020 18:06
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Причина в том, что такие целочисленные деления gridSize / 2 в Swift возвращают целые числа, а в Python grid / 2 возвращает число с плавающей запятой, хотя grid является целым числом.

Если вы хотите использовать аналогичный тип целочисленного деления в Python, вам нужно использовать оператор //.

Если вы исправите эту ошибку (и добавите значение по умолчанию для параметра grid, вы правильно получите вывод (2, 0) для ввода 4:

def posFromIndex(index, grid = 32):
    if index < 0:
        return -1, -1

    if grid < 1:
        return 0, 0

    localIndex = int(index / (grid * grid) * 4)
    qx = localIndex % 2
    qy = localIndex // 2

    hg = grid // 2
    x = qx * hg
    y = qy * hg

    nextIndex = index - localIndex * hg * hg

    nextX, nextY = posFromIndex(nextIndex, grid // 2)

    x += nextX
    y += nextY

    return x, y


print(posFromIndex(4))

Выход:

(2, 0)

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

Другие вопросы по теме