无法调用实现递归调用的方法

时间:2018-03-18 19:33:54

标签: python recursion

我是一名蟒蛇初学者。当我尝试在下面实现BinarySearchTree时,我收到以下错误

// omitted init. of functions
import * as express from 'express';

const cors = require('cors')({origin: true});
const app = express();
app.use(cors);

// The function to test
app.get('helloWorld, (req, res) => {
   res.send('hello world');
   return 'success';
});

exports.app = functions.https.onRequest(app);

非常感谢任何帮助。谢谢!

exec(code, run_globals) 
  File "binarysearchtree.py", line 23, in <module> 
    print(BinarySearchTree.contains(n2,3)) 
TypeError: contains() missing 1 required positional argument: 'value'

1 个答案:

答案 0 :(得分:2)

问题是您已将方法定义为staticmethod,但之后您尝试将其用作常规方法。

使用常规方法,当您执行obj.meth(a, b)时,它会调用Cls.meth(obj, a, b),将obj值作为self参数。

使用静态方法,obj.meth(a, b)只需调用Cls.meth(a, b)。没有self参数。

因此,错误是因为您要求self, root, value但仅传递root, value。正如例外所说的那样,你只有一个论点。

同时,你正试图在方法体中使用self,所以你不能只是摆脱它。

如果你真的希望这是一个静态方法在树上,因为你实际上用self实际做的唯一事情就是在类上调用static方法,你可以显式使用类名,如下所示:

@staticmethod
def contains(root, value):
    if (root is None):
        return None
    elif (root.value==value):
        return root
    elif (root.value < value):
        BinarySearchTree.contains(root.right,value)
    else:
        BinarySearchTree.contains(root.left,value)

然后你的代码就可以了。好吧,它会摆脱那个例外;它仍然有其他错误(比如没有将递归调用的结果返回到链中)。

但我不明白为什么你想要一个静态方法。

我的猜测是,你正在尝试移植基本上是ML-translated-to-Java设计的东西。在Java中,将一堆免费函数放在无用的类中算作OO。在Python中,您不需要这样做;你只需要在模块上有自由功能。除了混乱之外,静态方法并没有真正给你任何额外的东西。

或者您可以将其转换为OO。例如,如果合并树和节点类型(或将树转换为传递方法的根的节点句柄),则可以使contains成为完全正常的方法。然后你必须在每次递归调用之前而不是在顶部进行None检查,但就是这样。