Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何计算一棵数字树,其中的数字符合谓词?_Python_Python 3.x_Recursion_Tree - Fatal编程技术网

Python 如何计算一棵数字树,其中的数字符合谓词?

Python 如何计算一棵数字树,其中的数字符合谓词?,python,python-3.x,recursion,tree,Python,Python 3.x,Recursion,Tree,我试图定义一个计数函数,它对树中满足谓词的每个数字进行计数 #given function: class TN: def __init__(self,value,left=None,right=None): self.value = value self.left = left self.right = right def add(atree,value): if atree == None: return TN(

我试图定义一个计数函数,它对树中满足谓词的每个数字进行计数

#given function:
class TN:
    def __init__(self,value,left=None,right=None):
        self.value = value
        self.left  = left
        self.right = right

def add(atree,value):
    if atree == None:
       return TN(value)
    if value < atree.value:
       atree.left = add(atree.left,value)
       return atree
    elif value > atree.value:
       atree.right = add(atree.right,value)
       return atree
    else:
       return atree  # already in tree

def add_all(atree,values):
    for v in values:
        atree = add(atree,v)
    return atree

def is_prime (x):
    assert type(x) is int and x >= 0, 'predicate.is_prime x is not a positive int: '+str(x)
    if x <= 2:
       return x == 2
    for i in range(2,x):
       if x % i == 0:
          return False
    return True
比如说,

import random
values = [i for i in range(1,200)]
random.shuffle(values
) ###按以下方式调用count函数应该可以: 计数(全部相加(无,值),为素数)#-->46

我的计数函数为我提供:

AttributeError: 'NoneType' object has no attribute 'value'

我不熟悉使用tree,我想我在定义递归计数函数时遇到了问题。

至少有一个
t.left
属性是
None
。这是理所当然的,二叉树不会永远存在

但是,如果要计算与谓词匹配的所有值,则必须遍历所有这些元素,而不仅仅是那些与谓词匹配的元素。始终遍历节点,但仅返回匹配节点的计数:

def count(t, p):
    if t is None:
       return 0
    result = 1 if p(t.value) else 0
    return count(t.left, p) + result + count(t.right, p)
例如,返回当前节点的计数(0或1)加上左侧和右侧节点的递归计数。如果其中任何一个为
None
,则递归函数停止并返回这些函数的
0

您甚至可以使用:

def count(t, p):
    if t is None:
       return 0
    return count(t.left, p) + p(t.value) + count(t.right, p)
因为在Python中,布尔类型是
int
的子类,其中
True==1
False==0
;整数和布尔求和将布尔值视为整数:

>>> 0 + True
1

再次感谢你提供的细节,现在我明白了。
>>> 0 + True
1