-1

私は最初の MLM ソフトウェアを作成し、ダウンラインからポイントを取得する方法をコーディングできたと思いますが、それは再帰を使用しなかった再帰的な問題であり、それがより良いと思われる場合は再帰バージョンにリファクタリングする可能性があります。私たちのシステムでは、ディストリビューターのレベルは i 個のシルバーで測定され、販売される各製品に対してプロモーション/ボーナス/スコア/ポイントがアップラインで機能するため、ボブがアリスのスポンサーであり、アリスが購入した場合、ボブはポイントを獲得しますその購入の銀の数で測定されます。ユーザー クラスにビジネス関数を追加しました。

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

やるべきことは、注文の深さに応じてシルバーのわずか1%です. コードは実際にオーダー ダウンラインの正しい結果を出力しますが、私はまだ広範囲にテストしていません。コードが奇妙に見えると思われるかどうか、モデルが多少複雑/高度であるため、すべてを考えているかどうか疑問に思います。ユーザークラスはwebapp2からのもので、サブクラスを使用できましたが、それを行う時間がなかったので、そこにあるユーザークラスにメソッドを入れただけで、Jinja2のように呼び出すことができます{{user.this_month_non_manager_silver}}

再帰はこれを行う正しい方法かもしれませんが、私の解決策はまだOKではないので、先に進んでこのコードを今のところ保持できますか、それとも受け入れられないと思いますか?

建設的な批判をありがとう。

4

1 に答える 1

2

ここで私が目にする主な問題は、本質的に幅優先検索を行おうとしているということです (ディストリビューターの下にいるすべてのユーザーを見てから、それらのディストリビューターの下にあるすべてのユーザーを見るなど)。 while ループがループする時間は、最後のディストリビューターの下のユーザーのみを見ています。

重要な部分を python っぽいものに分解すると、次のようになります。

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

ご覧のとおり、ダウンラインの最初のセットがアクセスされた後のディストリビューターの値は、ユーザーのダウンラインの最後のディストリビューターです。次に for ループが実行されるときは、最後のディストリビューターのダウンラインだけが表示されます。

従来、ツリー ウォーキング アルゴリズムは再帰的であるか、スタックを使用したループ ベースです。一般に、メモリの制約に基づいてどちらかを選択します。ソリューションの反復を維持するには、上記の python-ish コードを次のように書き直す必要があります。

downlinestack = []
distributor=self
downlinestack += distributor.downline
while downlinestack:
    downline = downlinestack.pop()
    for person in downline:
        downlinestack.append(person.downline)
于 2012-02-02T06:52:57.153 に答える