1. ホーム
  2. python

[解決済み] Python再帰的パスカルトライアングル

2022-02-19 18:47:06

質問

反復関数を使ってパスカルの三角形を作る課題を終えた後、再帰関数を使って三角形を作り直そうとしました。引数として渡された数字に対応する個々の行を作成するところまではできました。しかし、その行を含む三角形全体を生成させようと何度か試みたのですが、失敗しました。さらに、入力された数値の範囲を反復処理し、反復処理された数値で再帰関数を呼び出し、個々の行をリストに追加してからそのリストを返すという別の関数も書いてみましたが、これも失敗しました。望ましい出力は、各内部リストが三角形の1行を含むリストのリストであるべきです。このように。

[[1], [1, 1], [1, 2, 1]...]

その代わりに、完全に1で埋め尽くされたネストされたリストのごちゃごちゃしたものが返されます。

行を追加する2番目の関数を除いた、問題の再帰的関数は次のとおりです(私はとにかく、すべてを含む1つの関数が欲しかったのです)。

def triangle(n):
    if n == 0:
        return []
    elif n == 1:
        return [1]
    else:
        new_row = [1]
        last_row = triangle(n-1)
        for i in range(len(last_row)-1):
            new_row.append(last_row[i] + last_row[i+1])
        new_row += [1]
    return new_row

はっきり言って、私はすでに与えられた課題をクリアしています。これは再帰についてより深く理解するためだけのものです...。

反復解法。

def triangle(n):
    result = []
    for row in range(n):
        newrow = [1]
        for col in range(1, row+1):
            newcell = newrow[col-1] * float(row+1-col)/col
            newrow.append(int(newcell))
        result.append(newrow)
    return result

解決方法は?

リストのリストを再帰的に渡して、リストの最後の要素(つまり三角形の最後の行)を選んで、新しい行を作るだけでいい。 こんな風にね。

def triangle(n):
    if n == 0:
        return []
    elif n == 1:
        return [[1]]
    else:
        new_row = [1]
        result = triangle(n-1)
        last_row = result[-1]
        for i in range(len(last_row)-1):
            new_row.append(last_row[i] + last_row[i+1])
        new_row += [1]
        result.append(new_row)
    return result