Python
 Computer >> コンピューター >  >> プログラミング >> Python

再帰を使って連結リスト内の特定要素の出現回数をカウントするPythonプログラム

再帰処理を利用して、連結リスト(リンクリスト)内に特定の要素が何回出現するかをカウントするには、次の3つのメソッドを定義します。連結リストへ要素を追加するメソッド、連結リストの要素を出力するメソッド、そして特定要素の出現回数を数えるメソッドです。

再帰を使用するため、補助関数(ヘルパー関数)も定義します。この補助関数が、先に定義した出現回数カウント用の関数を呼び出す仕組みになっています。

サンプルコード

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class my_linked_list:
    def __init__(self):
        self.head = None
        self.last_node = None

    def add_value(self, my_data):
        if self.last_node is None:
            self.head = Node(my_data)
            self.last_node = self.head
        else:
            self.last_node.next = Node(my_data)
        self.last_node = self.last_node.next

    def print_it(self):
        curr = self.head
        while curr:
            print(curr.data)
            curr = curr.next

    def count_val(self, key):
        return self.count_helper_fun(self.head, key)

    def count_helper_fun(self, curr, key):
        if curr is None:
            return 0

        if curr.data == key:
            return 1 + self.count_helper_fun(curr.next, key)
        else:
            return self.count_helper_fun(curr.next, key)

my_instance = my_linked_list()
my_list = [56, 43, 70, 67, 89, 91, 70, 23, 46, 70]
for elem in my_list:
    my_instance.add_value(elem)
print("連結リストの内容は以下の通りです:")
my_instance.print_it()

key_val = int(input('調べたいデータを入力してください:'))
count_val = my_instance.count_val(key_val)
print('{0} はリスト内に {1} 回出現します。'.format(key_val, count_val))

実行結果

連結リストの内容は以下の通りです:
56
43
70
67
89
91
70
23
46
70
調べたいデータを入力してください:70

70 はリスト内に 3 回出現します。

コードの解説

  • まず、「Node」クラスを作成します。これは連結リストの各ノードを表すクラスで、データ本体と次ノードへの参照を持っています。

  • 次に、必要な属性を持つ「my_linked_list」クラスを作成します。

  • 「__init__」(イニシャライザ)関数では、先頭ノードを示す「head」と末尾ノードを示す「last_node」を初期値「None」として初期化します。

  • 「add_value」という名前のメソッドを定義し、これを使って連結リストにデータを追加できるようにします。リストが空の場合は新規ノードを先頭に設定し、そうでなければ末尾に新しいノードを連結します。

  • 「print_it」という名前のメソッドを定義し、リスト全体を走査しながら各要素を出力します。

  • 「count_val」という名前のメソッドを定義し、内部で補助関数を呼び出します。外部からはこのメソッド経由でカウント処理を利用します。

  • さらに「count_helper_fun」という補助関数を定義します。この関数が再帰的に自分自身を呼び出すことで、連結リスト内の特定要素の出現頻度を求めます。現在のノードがNone(リストの終端)に達すれば0を返し、データがキーと一致すれば1を加算して次のノードへ進みます。

  • 「my_linked_list」クラスのオブジェクト(インスタンス)を生成します。

  • サンプルデータとして10個の整数をリストに追加し、「count_val」メソッドを呼び出して特定要素の出現頻度を取得します。

  • 最後に、その結果をコンソールに出力して表示します。

まとめ

このプログラムのように再帰を活用すると、ループ処理を書かずに連結リストをたどって要素をカウントできます。ただし、リストが非常に長い場合には再帰の深さ制限(Pythonのデフォルトでは約1000回)に注意が必要です。そのようなケースでは、while文による反復処理への置き換えも検討しましょう。

  1. 【Python入門】リスト内で2番目に大きい数値を見つける3つの方法

    はじめに この記事では、Pythonを使ってリスト内の2番目に大きい数値(次に大きい値)を見つける方法を、3つの異なるアプローチで解説します。初心者にもわかりやすいように、各手法の考え方・サンプルコード・実行結果を順番に紹介していきます。 問題の定義 問題: 与えられたリストの中から、2番目に大きい数値を求めて表示してください。 例えば [11, 22, 1, 2, 5, 67, 21, 32] というリストが与えられた場合、最大値は67なので、答えは 32 となります。 アプローチ1:set()関数とremove()関数を使う方法 まず、set() を使ってリストから重複する要素を取り除

  2. 【Python】タプルが出現するまでリスト内の要素数をカウントする方法

    リストAが与えられたとき、このリストにはネストされたタプルが含まれています。ここでの課題は、タプルの要素に到達するまで、リスト内の要素数をカウントすることです。この処理には、Python組み込みの isinstance() 関数を使用します。 isinstance() 関数は2つの引数を受け取ります。第1引数の「object」は判定対象となるオブジェクト、第2引数の「classinfo」はクラス・型、あるいはクラスや型のタプルです。オブジェクトが指定したクラス(またはそのサブクラス)のインスタンスである場合、もしくはタプル内のいずれかの型に一致する場合に True を返し、それ以外の場合は F