You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用yield获取嵌套函数全部结果?我的BST验证代码始终返回True求助

问题分析与解决

你的代码有这几个问题

  • 函数调用写错了:最后打印的是is_BST函数本身,不是执行结果,得写成print(is_BST());而且is_BST没定义参数,直接用全局变量root,建议改成把root作为参数传进去。
  • 递归生成器没传递结果:在is_BST1里递归调用自己时,没加yield from,导致递归里的yield输出传不到上层,all()根本捕获不到那些错误结果。
  • BST验证逻辑不对:你只检查了直接子节点和当前节点的大小,但有效BST要求整个左子树所有节点都比当前节点小,整个右子树所有节点都比当前节点大——比如左子树的右节点如果比根节点大,你的代码查不出来。
  • yield逻辑不全:只有左子节点不存在时才yield True,如果左右子节点都存在且符合直接大小,函数没任何输出,all()碰到空迭代器会返回True,这就是为啥你的代码总是返回True。

修复后的代码示例

下面是修正了递归生成器问题,同时补全BST验证逻辑的版本:

class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

def is_BST(root):
    if not root:
        return True
    return all(is_BST_valid(root, float('-inf'), float('inf')))

def is_BST_valid(curnode, lower, upper):
    # 先检查当前节点是否在合法范围内
    if not (lower < curnode.val < upper):
        yield False
        return
    # 递归检查右子树,把下界设为当前节点值
    if curnode.right:
        yield from is_BST_valid(curnode.right, curnode.val, upper)
    # 递归检查左子树,把上界设为当前节点值
    if curnode.left:
        yield from is_BST_valid(curnode.left, lower, curnode.val)
    # 所有检查通过,返回True
    yield True

# 测试用例:创建一个无效BST
root = TreeNode(5)
root.left = TreeNode(3)
root.left.right = TreeNode(6)  # 这个节点值6大于根节点5,属于无效情况
root.right = TreeNode(7)

print(is_BST(root))  # 输出False,符合预期

关于用yield获取嵌套函数结果的问题

当然可以,用yield from语法就行。在递归的生成器函数里,当你调用另一个生成器(比如递归调用自身)时,yield from 生成器会把嵌套生成器的所有yield结果逐个传递到上层,这样上层的all()或者其他迭代器就能拿到所有递归产生的结果。

内容的提问来源于stack exchange,提问作者fond bcn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 23:25:26