2011-04-05 21 views
41

Merhabalar, ev ödevim sorunlarımdan birini basitleştirmeye ve kodu biraz daha iyi hale getirmeye çalışıyorum. Çalıştığım şey ikili bir arama ağacı. Şu anda tüm öğeleri bulur ve bunları bir listeye koyar benim Tree() sınıfında bir işlev var.self.xxxx öğesini varsayılan parametre olarak kullanma - Python

tree = Tree() 
#insert a bunch of items into tree 

sonra ağaçtan bütün düğümlerin almak benim makeList() işlevini kullanın ve bir liste koyar. makeList() işlevini çağırmak için tree.makeList(tree.root) yapıyorum. Bana göre bu biraz tekrarlı görünüyor. tree. ile ağaç nesnesini zaten arıyorum çünkü tree.root sadece küçük bir yazmanın israfıdır.

Şu anda makeList fonksiyonudur:

def makeList(self, aNode): 
     if aNode is None: 
      return [] 
     return [aNode.data] + self.makeList(aNode.lChild) + self.makeList(aNode.rChild) 

Ben anot giriş varsayılan bir parametre (çalışmıyor) gibi aNode = self.root Bununla işlevini çalıştırabilir bu şekilde, tree.makeList() yapmak istiyorum.

İlk soru, neden işe yaramıyor?
İkinci soru, çalışabileceği bir yol var mı? Gördüğünüz gibi makeList() işlevi tekrarlayıcıdır, bu yüzden işlevin başında hiçbir şey tanımlayamıyorum veya sonsuz bir döngü elde ediyorum.

DÜZENLEME İşte istendiği gibi tüm kodu:

varsayılan argümanlar değil çağrı zamanda fonksiyon tanımı anda değerlendirilir çünkü çalışmıyor
class Node(object): 
    def __init__(self, data): 
     self.data = data 
     self.lChild = None 
     self.rChild = None 

class Tree(object): 
    def __init__(self): 
     self.root = None 

    def __str__(self): 
     current = self.root 

    def isEmpty(self): 
     if self.root == None: 
      return True 
     else: 
      return False 

    def insert (self, item): 
     newNode = Node (item) 
     current = self.root 
     parent = self.root 

     if self.root == None: 
      self.root = newNode 
     else: 
      while current != None: 
       parent = current 
       if item < current.data: 
        current = current.lChild 
       else: 
        current = current.rChild 

      if item < parent.data: 
       parent.lChild = newNode 
      else: 
       parent.rChild = newNode 

    def inOrder(self, aNode): 
     if aNode != None: 
      self.inOrder(aNode.lChild) 
      print aNode.data 
      self.inOrder(aNode.rChild) 

    def makeList(self, aNode): 
     if aNode is None: 
      return [] 
     return [aNode.data] + self.makeList(aNode.lChild) + self.makeList(aNode.rChild) 


    def isSimilar(self, n, m): 
     nList = self.makeList(n.root) 
     mList = self.makeList(m.root) 
     print mList == nList 
+1

Modül düzeyinde bir yöntemle 'kendi' ile ne yapmak istersiniz? Bu kesinlikle hiçbir şey yapmaz. MakeList2() bir sınıf yöntemi ise, lütfen bağlam olmadan snippet'leri doğru kodla belirtin. –

+0

makeList2() makeList() olduğunu varsayıyordu, ben düzenledim – crh878

+0

Bu nasıl bir anlam ifade etmiyor? MakeList() işlevimi daha basit bir şekilde aramak yerine ağacın kökü için bir varsayılan parametre kullanarak kullanmaya çalışıyorum. – crh878

cevap

31

İkinci soruya, sadece bakabilirsiniz için answered ilk soru

larsmans: None geçerli bir değer ise, bir tekil nöbetçi kullanılır?

def makeList(self, aNode=None): 
    if aNode is None: 
     aNode = self.root 
    treeaslist = [aNode.data] 
    if aNode.lChild: 
     treeaslist.extend(self.makeList(aNode.lChild)) 
    if aNode.rChild: 
     treeaslist.extend(self.makeList(aNode.rChild)) 
    return treeaslist 
26

:

def f(lst = []): 
    lst.append(1) 
    return lst 

print(f()) # prints [1] 
print(f()) # prints [1, 1] 

Ortak strateji, None varsayılan parametresini kullanmaktır. Eğer Özyinelemeyi önlemek için sıçrama önce

NOTHING = object() 

def f(arg = NOTHING): 
    if arg is NOTHING: 
     # no argument 
    # etc. 
+1

'Sentinel' öğesini çıkartabilirsiniz. Sadece 'NOTHING = object()' kullanın. Eşsiz bir tekil vermek için garantili, '' 'ile kontrol edebilirsiniz. – delnan

+0

@delnan: iyi nokta, 'Sentinel' kaldırıldı. –

+0

“Foo (1, None)” ve “foo (1)' in farklı şeyler yapmalarını şiddetle tavsiye ediyorum. –

İlgili konular