質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

Q&A

解決済

2回答

468閲覧

再帰と動的計画法のアルゴリズムに関するプログラムのエラー

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

0グッド

0クリップ

投稿2019/07/07 04:37

前提・実現したいこと

関数呼び出しをするプログラムの時間計算量についてで明記したプログラムを、動的計画法で書こうとしています。
目的としては、時間計算量がO(n^2)(予測)から動的計画法でO(n)に改善するためです。

関数呼び出しをするプログラムcountonesにおいて以下の再帰関係があると考えられます。

def countones(A,i)の再帰関係 ・countones(A,i) = 1 if i = len(A) and A[i] = 1 ・countones(A,i) = countones(A,i) if i<len(A) and A[i] = 1 ・countones(A,i) = 0 if A[i] = 0

発生している問題・エラーメッセージ

前提条件の考え方に問題がある可能性もありますが、現在のプログラムでは以下のエラーが出ている状態で、どのように修正していくべきか悩んでいます。

Traceback (most recent call last): File "longestones2.py", line 21, in <module> print(longestnum2(A)) File "longestones2.py", line 6, in longestnum2 if A[i] == 0: IndexError: list index out of range

該当のソースコード

python

1def longestnum2(A): 2 max = 0 3 T = [0] * len(A) 4 for j in range(len(A)): #繰り返し O(n) 5 i = len(A) - j 6 if A[i] == 0: 7 T[i] = 0 8 elif i == len(A) and A[i] == 1: 9 T[i] = 1 10 else: 11 T[i] = T[i+1] + 1 12 if max < T[i]: 13 max = T[i] 14 15 return max 16 17 18 19 20A = [1,1,0,0,0,1,1,1,1,0,0] 21print(longestnum2(A))

補足情報(FW/ツールのバージョンなど)

python 3.6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Python

1#def longestnum2(A): 2def longestnum2(A : list) -> int: 3 max = 0 4 #T = [0] * len(A) 5 T = copy.deepcopy(A) 6 for j in range(len(A)): #繰り返し O(n) 7 #i = len(A) - j 8 i = (len(A) - 1) - j 9 if A[i] == 0: 10 T[i] = 0 11 #elif i == len(A) and A[i] == 1: 12 elif i == len(A) - 1 and A[i] == 1: 13 T[i] = 1 14 else: 15 #ここ何がしたいのか分かりません。 16 T[i] = T[i+1] + 1 17 #ここも何がしたいのか分かりません。 18 if max < T[i]: 19 max = T[i] 20 21 return max

ひとまず、こんな感じですかね...
まずfor文の仕様を知りましょう。
後、再帰と書いていますが、再起処理が発生しているように見えません。

投稿2019/07/10 08:27

編集2019/07/10 08:28
stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

IndexError: list index out of range

listの範囲を超えてアクセスしている、というエラーです。
当然のことながら、範囲を超えないように修正しましょう

投稿2019/07/07 04:41

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/07/10 03:16

ご回答ありがとうございます。 listの範囲を超えてアクセスしていることはわかったのですが、現状からどのように修正すればいいか検討がつきません。
y_waiwai

2019/07/10 06:24

その関数をどう動作させるのかわからんので、私に聞かれても。。 それより、そのエラーが出るとき、どういう値でアクセスしてるか調べてみれば
fana

2019/07/10 06:30

iの値がいきなり範囲外になってそう.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問