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