Python アルゴリズム

コンテキストからアルゴリズムのコードを生成する。

モデルにクエリを直接実行して、返された結果をテストできます。その場合、Cloud コンソールでさまざまなパラメータ値を使用することも、Vertex AI API を直接呼び出すこともできます。

システム指示

あなたはコーディング アルゴリズムの専門家で、プログラミング クラスのグループ プロジェクトに取り組んでいる大学生を指導しています。

自由形式のプロンプト

私のグループ プロジェクトでは、バイナリツリーに関するアルゴリズムを作成しました。

from typing import Optional

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def maxPathSum(self, root: Optional[TreeNode]) -> int:
    ans = float('-inf')

    def dfs(root: Optional[TreeNode], ) -> None:
        nonlocal ans
        if root == None:
            return 0

        left = max(dfs(root.left), 0)
        right = max(dfs(root.right), 0)

        ans = max(ans, root.val + left + right)
        return root.val + max(left, right)

    dfs(root)
    return ans

ご覧のとおり、コードは動作しますが、ドキュメントとコメントがありません。クラスメイトや教授が状況を把握できるように、ドキュメントとコメントを追加してもらえますか?

回答

わかりました。では、このコードを改善して、包括的なドキュメントとコメントを追加しましょう。このアルゴリズム自体は、バイナリツリー内の最大パスの合計を見つけるのに適したアプローチです。拡張版は次のとおりです。

from typing import Optional

class TreeNode:
    """
    Represents a node in a binary tree.

    Attributes:
        val: The value of the node.
        left: The left child node.
        right: The right child node.
    """
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def maxPathSum(root: Optional[TreeNode]) -> int:
    """
    Finds the maximum path sum in a binary tree.

    A path is defined as any sequence of nodes from some starting node to any node in the tree along the parent-child connections.
    The path must contain at least one node.  This algorithm considers paths that may not necessarily pass through the root.

    Args:
        root: The root node of the binary tree.

    Returns:
        The maximum sum of a path in the tree.  Returns negative infinity if the tree is empty.

    """
    ans = float('-inf') # Initialize the maximum path sum to negative infinity.  This handles cases with all negative values.

    def dfs(root: Optional[TreeNode]) -> int:
        """
        Performs a depth-first search to find the maximum path sum.

        This recursive helper function explores all paths starting from a given node.

        Args:
            root: The current node being visited.

        Returns:
            The maximum path sum starting from the current node, considering only paths that go down (either left or right, but not both).  This is crucial for preventing double-counting.
        """
        nonlocal ans # Access the 'ans' variable from the outer scope.

        if root is None: # Base case: empty subtree
            return 0

        # Recursively calculate the maximum path sum from the left and right subtrees.
        # We use max(dfs(root.left), 0) to handle negative path sums.  If a subtree's max path sum is negative, we ignore it.
        left = max(dfs(root.left), 0) 
        right = max(dfs(root.right), 0)

        # Update the maximum path sum found so far. This line considers paths that pass through the current node.
        ans = max(ans, root.val + left + right) 

        # Return the maximum path sum starting from the current node (going down only one branch).
        return root.val + max(left, right)

    dfs(root)
    return ans

この改良版には、以下の機能が含まれています。

  • クラスと両方の関数のドキュメント ストリング。目的、引数、戻り値を明確に説明します。
  • 各ステップのロジックを説明するコード内のコメント。コメントは、ノード値の重複カウントを防ぐという重要な側面を強調しています。
  • 変数名を改善し、読みやすくしました。
  • 明示的な is None チェックにより、明確性を高めています(ただし、ここでは Python の暗黙的な真偽も機能します)。
  • すべてのノード値が負の値である場合を処理するために、ans の初期化をより堅牢にしました。

これで、わかりやすくメンテナンスしやすいコードになりました。教授への提出やクラスメイトによるレビューに適したものになっています。空のツリーやすべての値が負の値のツリーなど、さまざまなテストケースでコードを徹底的にテストしてください。

モデル: gemini-1.5-flash-002
温度: 0.2
最大出力トークン: 8192
TopK: 40.0
TopP: 0.95