передача собственных данных в рекурсивную функцию

1

Я пытаюсь установить функцию, чтобы сделать что-то вроде этого

   def __binaryTreeInsert(self, toInsert, currentNode=getRoot(), parentNode=None):

где текущий node начинается с root, а затем мы меняем его на другой node в методе и рекурсивно вызываем его снова.

Однако я не могу заставить "currentNode = getRoot()" работать. Если я попробую назвать funcion getRoot() (как указано выше), он говорит, что im не дает ему все необходимые переменные, но если я пытаюсь вызвать self.getRoot(), он жалуется, что self является переменной undefined. Есть ли способ, которым я могу это сделать, не указывая корень при вызове этого метода?

EDIT: базовый случай этого метода уже

if currentNode == None:

поэтому использование этого для установки корня не будет работать

  • 0
    Мне кажется очень странным, что getRoot , очевидно, является функцией уровня модуля без аргументов? Используете ли вы глобальное пространство имен модуля, когда вам нужен экземпляр класса, или вы забыли о self , или я что-то упустил?
  • 0
    is None как правило, предпочтительнее, чем == None .
Показать ещё 3 комментария
Теги:
recursion
self

4 ответа

2
Лучший ответ

В то время как arg=None является идиоматическим значением Python для аргумента, не связанного с поставкой, он не должен быть None. В Lua, например, идиоматический аргумент без аргумента - пустая таблица. Фактически мы можем применить это к этому случаю:

class Foo:
    sentinel = {}
    def bar(self, arg=sentinel):
        if arg is self.sentinel:
            print "You didn't supply an argument!"
        else:
            print "The argument was", arg

f = Foo()
f.bar(123)
f.bar()
f.bar(None)
f.bar({})

Вывод:

The argument was 123
You didn't supply an argument!
The argument was None
The argument was {}

Это работает для любого случая, кроме явно переданного Foo.sentinel, потому что Foo.sentinel гарантированно имеет уникальный адрес - значение, x is Foo.sentinel является истинным только тогда, когда x является Foo.sentinel:) Таким образом, из-за закрытия мы создали вокруг Foo.sentinel, есть только один объект, который может создать неоднозначную ситуацию, и он никогда не будет использоваться случайно.

  • 0
    Что я искал Я частично хочу сделать это для дальнейшей абстракции, но в основном мне было просто интересно, если / как это можно сделать.
  • 0
    Всегда наследуйте object а не ничего, чтобы использовать классы нового стиля.
Показать ещё 1 комментарий
0

Когда определена функция или метод, строка def оценивается немедленно, включая любые аргументы ключевых слов. По этой причине такие вещи, как вызовы функций и изменяемые объекты, обычно не подходят для аргументов по умолчанию.

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

not_provided = object()
def _binaryTreeInsert(self, toInsert, currentNode=not_provided, parentNode=None):
    if currentNode is not_provided:
        currentNode = self.getRoot()
0

Вы можете сделать

def __binaryTreeInsert(self, toInsert, currentNode=None, parentNode=None):
   if currentNode is None:
      currentNode = self.getRoot()

...
  • 0
    Я думал об этом, но проблема в том, что базовый случай рекурсии «если curentNode равен None:», поэтому он не будет работать с остальной частью метода
  • 0
    @user, тогда ты собираешься дать больше информации. Если вы посмотрите на это, вы все равно сможете проверить, является ли оно None или нет.
Показать ещё 4 комментария
-2
def __binaryTreeInsert(self, toInsert, currentNode=0, parentNode=None):
    if not currentNode: 
        currentNode = self.getRoot()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню