Pythonでラダープログラム(椅子問題)を実装する方法

スポンサーリンク

この記事では、「梯子問題」と呼ばれる非常に興味深い問題を理解します。

まず、この問題で何を達成したいかを理解しましょう。

スポンサーリンク

ラダー問題を理解する

この問題では,2つの入力が与えられる.1つは段数で,もう1つは人が一度に歩ける最大段数である.

例えば,最大歩数=3であるとする.人はある時間に1歩、2歩、3歩のいずれかを歩くことができる。

一度に1歩、2歩、3歩のいずれかを踏み、梯子の頂上に到達する方法をすべて数える必要がある。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def count_no_ways(n,k):
 
    if(n<0):
        return 0
     
    # already on top
    if(n==0):
        return 1
 
    if(n<3):
        return n
 
    ans = 0
    for i in range(1,k+1):
        ans+=count_no_ways(n-i,k)
    return ans
 
n = int(input())
k = int(input())
 
print(count_no_ways(n,k))

梯子問題の解決策

さて、この問題は、通常のループ処理やif-else文を使って解くことができる。

しかし、より良い方法は、再帰的アプローチに従うことです。

もし、Recursionがどのように機能するのか知らないのであれば、以下のチュートリアルを読むことをお勧めします。

Recursionについてもっと読む。

この問題を解くために、最小の問題、すなわち、n = 1からn = nまでの問題を探すことになります。

その場合を下図に示す。

Recursive Solution Ladders Problem 1
Recursive Solution Ladders Problem 1

では、梯子問題のコード実装を見てみましょう。

Pythonによる梯子問題のコード実装

ここでは、k回の最大ステップの方法を計算します。

そのため、(n-1),(n-2),(n-3)と順に(n-k)まで計算することになる。

そして最後に、得られた値をすべて合計して、最終的な答えを返すことになります。

以下はその実装コードです。

Recursive Solution Ladders Problem
Recursive Solution Ladders Problem

結果は以下の通りです。

17
17
65536

梯子問題で使われた再帰の概念が理解でき、自分で同じように実装できるようになれば幸いです。

読んでくれてありがとうございます。

タイトルとURLをコピーしました