Извиняюсь за возможную путаницу по поводу названия.Я приложу все усилия, чтобы проиллюстрировать мой вопрос.
Контекст:
Я только что закончил работу над интересной проблемой кодирования на CodeWars , где меня попросили написать функцию дляупростить список направлений.
Ввод будет выглядеть как ["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]
'SOUTH' 'NORTH'
и 'EAST' 'WEST'
, которые находятся рядом друг с другом, должны быть удалены, так как не имеет смысла идти на север, а затем сразу на юг,И список должен быть упрощен до тех пор, пока он не может быть упрощен.
Например:
["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]
должен быть упрощен до
['WEST']
Dummy OP написал aнеуклюжая функция, которая делает это.Но мой вопрос о действительно умном ответе, опубликованном кем-то другим.
Код:
def dirReduc(arr):
dir = " ".join(arr)
dir2 = dir.replace("NORTH SOUTH",'').replace("SOUTH NORTH",'').replace("EAST WEST",'').replace("WEST EAST",'')
dir3 = dir2.split()
return dirReduc(dir3) if len(dir3) < len(arr) else dir3
Я поиграл с ним и увидел, что он работает, но просто не мог понять, как,
Я вижу, что в операторе return он будет выполняться снова, если результат не будет иметь ту же длину, что и input, что понятно.Но в коде используется dirReduc(dir3)
, что мне кажется неправильным.
Если я запускаю dirReduc(dir3)
, тогда мой ввод будет dir3
, но затем внутри фрейма функции будет создан другой dir3
.Поэтому теперь, когда функция переходит к окончательному оператору возврата, она должна быть return dirReduc(dir3) if len(dir3) < len(dir3) else dir3
.А так как len(dir3) == len(dir3)', it will just return
dir3`.
В моем понимании, функция будет запускаться дважды, максимум с каждым входом, что не соответствует действительности.Так какая часть моего понимания неверна?
Извините за огромное количество слов, я думаю, в конце концов, это простая проблема.Там должно быть очень фундаментальное, что я ошибаюсь.