传销下线分销公司

2024-09-30 01:28:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我做了我的第一个传销软件,我想我成功地编写了如何从下线获取点数的代码,即使这是一个递归问题,我没有使用递归,我可能会重构到递归版本,如果这看起来更好的话。在我们的系统中,分销商的级别是通过银牌数量来衡量的,对于每一个售出的产品,促销/奖金/分数/积分都是上行的,因此如果Bob是Alice的赞助人,Alice进行了购买,那么Bob将获得以银牌数为单位的积分。我在用户类中添加了一个业务函数:

def this_month_non_manager_silver(self):
    silver = 0 
    today = date.today()
    timeline = date(today.year, today.month, 1) 
    downline = User.query(User.sponsor
            == self._key).fetch()
    distributor = self
    while distributor.has_downline():
        downline = User.query(User.sponsor == distributor.key).fetch()
        for person in downline:  
            orders = model.Order.all().filter('buyer_id =' , person.key.id()).filter('created >' , timeline).filter('status =', 'PAID').fetch(999999)
            for order in orders:
                for idx,item in enumerate(order.items):
                    purchase = model.Item.get_by_id(long(item.id()))
                    amount = int(order.amounts[idx])
                    silver = silver + amount*purchase.silver/1000.000 
            distributor = person
    return silver

现在可能要做的是根据订单的深度在银上加一个百分点。 代码实际上输出了订单下线的正确结果,但我还没有进行广泛的测试,我想知道您是否认为代码看起来很奇怪,以及我是否考虑过所有这些,因为模型有些复杂/高级。user类来自webapp2,我可以使用一个子类,但是我没有时间这么做,所以我只把方法放在用户类中,现在我可以像{{user.this_month_non_manager_silver}}一样从Jinja2调用它

递归可能是正确的方法,但我的解决方案不是还可以,我可以继续并保留这段代码,或者你认为它是不可接受的吗?在

谢谢你的建设性批评。在


Tags: key代码inselfidfortodaysilver
1条回答
网友
1楼 · 发布于 2024-09-30 01:28:35

我在这里看到的主要问题是,您实际上是在尝试进行广度优先搜索(您会查看分发服务器下面的所有用户,然后查看这些分发服务器下面的所有用户,等等),但是每次while循环循环时,您只查看最后一个分发服务器下面的用户。在

如果我们把重要的部分分解成类似python的东西,就会得到:

distributor=self
while distributor.has_downline():
    for person in distributor.downline:
        distributor = person

如您所见,在访问第一组下行线之后,distributor的值是用户下线中的最后一个分发服务器。下一次运行for循环时,您只查看最后一个分发服务器的下行链路。在

传统的树行走算法要么是递归的,要么是基于堆栈的循环算法。通常,您将根据内存限制选择一个或另一个。为了保持解决方案的迭代性,您需要像这样重写上面的python-ish代码:

^{pr2}$

相关问题 更多 >

    热门问题