ホーム>source

だから私はalgoExpert.ioの問題を解決しています、 問題は、すべての分岐の合計を左から右に計算するアルゴリズムを書くことです。 問題は、ヘルパー関数を呼び出す方法に応じてテストに合格し、その理由が本当にわからないことです。

<前>ウィズウィズ

これはこれまでのところすべて良好であり、

<前>ウィズウィズ

この写真からわかるように、これは正常に機能します。

しかし、これを行うとすぐに(これが私の元の解決策でした):

<前>ウィズウィズ

なぜデフォルトのsums = []を使用すると、このように失敗するのですか?

これはエラーメッセージです。 テストケースではルート1と左の子3を使用していることがわかります。 そして、2番目の方法を使用すると、コードが出力[1、3]します。

私はこれを本当に理解することができません、どんな助けもいただければ幸いです。

class BinaryTree: def __init__(self, value): self.value = value self.left = None self.right = None def branchHelper(root, sums=[], branchSum=0): if root is None: return branchSum += root.value if root.left is None and root.right is None: sums.append(branchSum) branchHelper(root.left, sums, branchSum) branchHelper(root.right, sums, branchSum) return sums
あなたの答え
  • 解決した方法 # 1

    これは、デフォルト値を持つ2番目の合計パラメーターが原因です。

    次に書き直すとテストに合格します

    <前>ウィズウィズ

    それが間違っている理由の例:

    <前>ウィズウィズ

    関数が初めて呼び出されたときに、Pythonは永続的なリストを作成します。その後のappendの呼び出しごとに、その元のリストに値が追加されます。 algoExpert.ioがコードをテストすると、それが起こります。

    そして、それが最初のテストが成功し、2番目が失敗した理由です(1つの項目1を持つ最初のテストバイナリツリー、2番目のテストは次に1、2でチェックし、新しい値を def branchHelper(root, sums=None, branchSum=0): if root is None: return if sums is None: sums = [] branchSum += root.value if root.left is None and root.right is None: sums.append(branchSum) branchHelper(root.left, sums, branchSum) branchHelper(root.right, sums, branchSum) return sums に追加します)  リスト、そしてあなたは失敗したテストを得ました。

  • 解決した方法 # 2

    あなたはbranchHelper内でbranchHelperを使用しているため、再帰を行っています。

    したがって、最初のコードでは、合計パラメーターを関数に渡すと、再帰の後続の反復で、更新された合計リストを取得します。

    2番目のコードでは、合計パラメーターを渡さない場合、後続のすべての反復で、デフォルトの合計が常に空のリストになります。

    def wrong_func(append_item, items=[]): items.append(append_item) return items wrong_func(1) # output [1] wrong_func(2) # output [1, 2] def correct_func(append_item, items=None): if items is None: items = [] items.append(append_item) return items correct_func(1) # output [1] correct_func(2) # output [2]

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ KODIプレーヤーの複雑なJSON配列PHP 52で処理する値が必要