2013-04-05 112 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