我有这段自称的代码:
def get_input():
my_var = input('Enter "a" or "b": ')
if my_var != "a" and my_var != "b":
print('You didn\'t type "a" or "b". Try again.')
get_input()
else:
return my_var
print('got input:', get_input())
Run Code Online (Sandbox Code Playgroud)
现在,如果我输入"a"或"b",一切都很好.输出是:
Type "a" or "b": a
got input: a
Run Code Online (Sandbox Code Playgroud)
但是,如果我输入其他内容然后输入"a"或"b",我会得到:
Type "a" or "b": purple
You didn't type "a" or "b". Try again.
Type "a" or "b": a
got input: None
Run Code Online (Sandbox Code Playgroud)
我不知道为什么get_input()要回来None,因为它应该只返回my_var.print语句显示None正确的值,但函数由于某种原因不返回该值.
我对Python和整个递归函数都很陌生,所以请原谅我的无知.
我试图在Python中实现二进制搜索树并具有以下插入方法(从类中取出):
def insert(self, key, root=None):
'''Inserts a node in the tree'''
if root == None:
root = self.root
if root.key == None:
self._update(root, key)
return 0
else:
tmp = root
if key > tmp.key: # we work with the right subtree
self.insert(key, root=tmp.right)
elif key < tmp.key: # we work with the left subtree
self.insert(key, root=tmp.left)
else: # key already exists
return 0
Run Code Online (Sandbox Code Playgroud)
我不确定这是否清晰,但是它会遍历树,直到它达到None值并使用要插入的键更新节点.
现在,该方法可以正常工作并从头开始正确创建BST.但是返回语句存在问题,因为如果没有执行递归,它只返回0.
>>> bst.insert(10)
0
>>> bst.insert(15)
>>> bst.root.right.key
15
>>>
Run Code Online (Sandbox Code Playgroud)
"插入"根键再次返回0(从第15行)它应该的方式.
>>> bst.insert(10)
0
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚为什么会这样.如果我在第6行放置一个print语句,它会正确执行,但它不会在第一次插入后返回任何内容.为什么是这样?(我很确定我遗漏了一些关于Python和递归的基本信息) …
我目前在学校学习递归,当有很多递归调用时,我很难考虑方法.我只想问你应该如何考虑递归,因为我知道每一步跟踪方法调用都会变得太乏味.
我们简要介绍的不是跟踪每个递归调用,而是考虑通过归纳进行递归,但我遇到的问题是如何将归纳法应用于数学以外的情境.就像有一个方法递归打印出这样的数字:
public void blah(int n)
{
for (int i = 0; i < n; i++)
blah(i);
System.out.print(n);
}
Run Code Online (Sandbox Code Playgroud)
我无法考虑打印出来的内容,我无法看到感应在这里是如何相关的(原谅我的无知,如果它可以在任何地方使用).
但我想我真正的问题是如何在不必跟踪每个方法调用的情况下解决递归问题?最好的做法只是看看基本案例和倒退工作吗?(但即便如此,我认为我对发生的事情感到模糊).