【问题标题】:How to count a tree of numbers which the number fit the predicate?如何计算数字符合谓词的数字树?
【发布时间】:2014-11-23 10:11:13
【问题描述】:

我正在尝试定义一个计数函数来计算树中满足谓词的每个数字。

#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

add_all 函数接受一个列表并返回一个树。 如果 int 参数为素数,is_prime 函数返回 True。

#function I am trying to define (a recursive function: count):
def count(t,p):
    if t==None:
       return 0
    else:
       return 1+count((t.left if p(t.left.value) else t.right),p)

例如,

import random
values = [i for i in range(1,200)]
random.shuffle(values

) ###调用计数函数如下应该给我: count(add_all(None, values), is_prime) # --> 46

我的计数功能给了我:

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

我是新来使用树,我认为我在定义我的递归计数函数时遇到了问题。

【问题讨论】:

    标签: python python-3.x recursion tree


    【解决方案1】:

    至少有一个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 == 1False == 0;对整数和布尔值求和会将布尔值视为整数:

    >>> 0 + True
    1
    

    【讨论】:

    • 再次感谢您的详细说明,现在我明白了。
    猜你喜欢
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    相关资源
    最近更新 更多