我做了我的第一个传销软件,我想我成功地编写了如何从下线获取点数的代码,即使这是一个递归问题,我没有使用递归,我可能会重构到递归版本,如果这看起来更好的话。在我们的系统中,分销商的级别是通过银牌数量来衡量的,对于每一个售出的产品,促销/奖金/分数/积分都是上行的,因此如果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调用它
递归可能是正确的方法,但我的解决方案不是还可以,我可以继续并保留这段代码,或者你认为它是不可接受的吗?在
谢谢你的建设性批评。在
我在这里看到的主要问题是,您实际上是在尝试进行广度优先搜索(您会查看分发服务器下面的所有用户,然后查看这些分发服务器下面的所有用户,等等),但是每次while循环循环时,您只查看最后一个分发服务器下面的用户。在
如果我们把重要的部分分解成类似python的东西,就会得到:
如您所见,在访问第一组下行线之后,distributor的值是用户下线中的最后一个分发服务器。下一次运行for循环时,您只查看最后一个分发服务器的下行链路。在
传统的树行走算法要么是递归的,要么是基于堆栈的循环算法。通常,您将根据内存限制选择一个或另一个。为了保持解决方案的迭代性,您需要像这样重写上面的python-ish代码:
^{pr2}$相关问题 更多 >
编程相关推荐