2013-04-05 153 views
0

所以我寫了一個代碼,該代碼應該可以獲取樹中給定節點的父代。這是僞代碼。從根開始,返回語句不執行

def parent(self, child): 
    if right child exists: 
     if the right child == child: 
      return self 
     else: self.right.parent(child) 
    if left child exists: 
     if the left child == child: 
      print('f') 
      return self 
     else: self.left._get_parent(node) 

我不停地遇到這個問題一遍又一遍。 對於if the left child == child:聲明,函數DOES在找到the left child == childthe right child == child時輸入if語句。

但是,return語句不會執行此操作。我知道這一點,因爲當我寫if the left child == child:並在寫完print('f')之後,它確實打印了f,但是它並沒有返回self。有誰知道爲什麼和誰能提供一個解決方案來解決這個問題?

此外,有沒有人知道如何一次返回兩個語句而不是元組或列表? 例如,如果我想回到1和2,

def x(n): 
    return 1, 2 

這將返回(1, 2) ..有什麼辦法爲它不會返回它作爲一個元組?只是爲了正常返回它。我這樣問,因爲當涉及到遞歸時,我想調用1 AS和2的相同函數,而不是在元組(1, 2)上。

+1

'1,2' ** **是一個元組。圓括號是句法糖,真的。返回一個元組是*返回多個值的方式。只需*索引*返回值或使用元組拆包。 – 2013-04-05 15:36:46

回答

2

您的代碼丟棄else:分支中的遞歸調用的返回值。你需要更多的return聲明:

if right child exists: 
    if the right child == child: 
     return self 
    else: 
     return self.right.parent(child) 
if left child exists: 
    if the left child == child: 
     print('f') 
     return self 
    else: 
     return self.left._get_parent(node) 

在Python,表達1, 2創建一個元組,這是從函數返回多個值的規範方式。這就是通過返回一個元組來返回多個值的方法。

只需解壓返回值:

def foo(): 
    return 1, 2 

value1, value2 = foo() 

,或者使用索引:

values = foo() 
values[0], values[1] 
+0

你寫的功能不起作用。它只會讓孩子回到正確的孩子身上,而不是回到孩子身上。 – 2013-04-05 15:47:26

+1

我們爲什麼要出門?我所做的只是將'return'語句添加到您的代碼中。如果你的代碼沒有返回左邊的孩子,你需要驗證你的算法。 – 2013-04-05 15:48:38