2014-11-02 139 views
0

您好,我想知道是否有方法通过函数递归而不改变变量的值。如何在不改变变量的情况下进行递归

这里是我的代码:

def helper_list_range(self, low, high, rangelist): 
    if self is EmptyValue: 
     return rangelist 

    else: 
     if self.left is not None and self.right is not None: 
      if self.root <= high and self.root >= low: 
       rangelist.append(self.root) 

      self.left.helper_list_range(rangelist) 
      self.right.helper_list_range(rangelist) 

      return rangelist 


def list_range(self, low, high): 

    rangelist = [] 
    self.helper_list_range(low, high, rangelist) 
    return rangelist 

正如你可以看到,我使用一个辅助函数,这样我追加到rangelist,而不改变其价值时,这个函数执行递归。

我想知道有没有一种方法可以做到这一点,而无需使用辅助函数。使用辅助函数似乎有点模糊。

+0

帮助函数与“附加到范围列表而不更改其值”无关。帮助函数是完成所有工作的东西,使用从主函数传入的空列表。 – 2014-11-02 19:11:08

+0

是的,我在主函数中创建了空列表,但是如果我是在辅助函数中创建它的话。该列表将再次变为空。一旦函数递归。所以我想知道,如果我们可以使用与递归发生在同一个函数中的列表 – Andre 2014-11-02 19:12:36

回答

2

我想你找默认参数:

def list_range(self, low, high, rangelist = None): 

    if rangelist is None: 
     rangelist = [] 
    # here goes the code of helper_list_range 
+0

哦,是的,我认为这样做会起作用。 – Andre 2014-11-02 19:18:50

1

如果我是你,我不会用自己作为一个参数。最好传递树的根值,然后处理它。我也不会继续传递一个列表,然后附加值。我认为通过堆积式回传呼叫建立清单价值更有意义。

根据您如何定义您的BST,我使用一种功能为您的问题写了一个简短的解决方案。我还没有测试过它,因为我没有你的数据结构,所以让我知道是否有任何错误。

​​
+0

是的,这很好。但是自我就像是我的节点......因为我在课堂上使用它。 – Andre 2014-11-02 19:49:27

+0

然后在你打电话时自我传递。你应该使用这个函数,而不是你上面所说的,因为以这种方式堆栈返回调用比追加结果更加正确,而缺省值是一个黑客。 – 2014-11-02 21:05:24

相关问题