Python初心者で基本的なことばかりですみません。
Pythonの数列の足し算のコードの書き方がよくわかりません。
具体的には例えばT1=2, Tn=3Tn-1-1 の場合、10項目までの足し算といった場合、forで繰り返して足していくという作業だと思います。
TnはTn-1番目の値に3をかけてマイナス1という作業の他仕込みがよくわかりません。
def sumS(n): acc = 2 for n in range(1,10+1): acc += n*3 -1 return acc print(sumS(10))
これだとnに3をかけて1をひくということになってしまいます。
こういう場合、どうやってコードをかいたらいいのかよくわかりません。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
こんにちは
漸化式
Tn=3Tn-1-1
をコードに落とし込むには、まずは Tn-1
に相当する変数を用意するとよいです。以下では、Tn
に相当する変数を t
とし、Tn-1
に相当する変数を prevT
としました。
コード例1
python
1def sumS(n): 2 acc = 0 3 prevT = None 4 for n in range(1,10+1): 5 t = 3 * prevT - 1 if n > 1 else 2 6 prevT, acc = t, acc + t 7 return acc 8 9print(sumS(10))
上記によって、T1
から T10
までの、以下の10個の数
2 5 14 41 122 365 1094 3281 9842 29525
の合計の 44291
が表示されます。
- 動作確認用Repl.it: https://repl.it/@jun68ykt/Q270225
そして、上記のコードをあらためて見直してリファクタリングし、prevT
を削除できそうなので、削除すると以下になります。
コード例2
python
1def sumS(n): 2 acc = 0 3 t = None 4 for n in range(1,10+1): 5 t = 3 * t - 1 if n > 1 else 2 6 acc += t 7 return acc 8 9print(sumS(10)) 10
- 動作確認用Repl.it: https://repl.it/@jun68ykt/Q2702252
もちろん、ひとつ前の項を入れておく変数(ここでは prevT
)を使わないコードを、初めから書けるようになればそれに越したことはありません。
さらに、数列Tn
の初項2
を t
の初期値として代入しておけば、t = 3 * t - 1 if n > 1 else 2
の if n > 1 else 2
が不要になって、以下となります。
コード例3
python
1def sumS(n): 2 acc = 0 3 t = 2 4 for n in range(1, 10+1): 5 acc += t 6 t = 3 * t - 1 7 return acc 8 9print(sumS(10))
- 動作確認用Repl.it: https://repl.it/@jun68ykt/Q2702253
投稿2020/06/15 10:18
編集2020/06/15 12:08総合スコア9058
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/06/15 11:39
2020/06/15 12:26 編集
退会済みユーザー
2020/06/15 12:37
2020/06/15 12:41
0
ベストアンサー
関数をいきなり短く書くよりも、最初は分かりやすい形で書いて、徐々に簡易化していくのが良いと思います。例えば今回の設問の場合、漸化式ですので配列や辞書を用いた方が数式と対応するため理解が簡単だと思います(この例では説明の簡単化のために辞書を使っています)。
def sumS(nmax): T = {} # 漸化式を計算 T[1] = 2 for n in range(2, nmax + 1): T[n] = 3 * T[n - 1] - 1 # 和を計算 acc = T[1] for n in range(2, nmax + 1): acc += T[n] return acc print(sumS(10))
上のソースコードを見るとループが2回行われているため、これを1回にまとめたいと思うと、次のようになります。
def sumS(nmax): T = {} T[1] = 2 acc = T[1] for n in range(2, nmax + 1): # 漸化式を計算 T[n] = 3 * T[n - 1] - 1 # 和を計算 acc += T[n] return acc print(sumS(10))
さらに上のソースコードをよく見ると、和を計算する箇所はT[n]しか使っていませんので、T[n-1]を覚えておく必要はないことに気がつきます。上書きして捨てて良ければ変数に置き換えることができます。
def sumS(nmax): T = 2 acc = T for n in range(2, nmax + 1): # 漸化式を計算 T = 3 * T - 1 # T[n - 1]の情報は上書きして捨てている # 和を計算 acc += T return acc print(sumS(10))
さらに上のソースコードでは n を使っていないことが分かります。2からnmaxまで繰り返していますが、 n を使っていないので0から(nmax-2)でも構いません。とにかくループ回数をnmax-1回にすれば良いことが分かります。したがってさらに簡易化できます。
def sumS(nmax): T = 2 acc = T for _ in range(nmax - 1): T = 3 * T - 1 acc += T return acc print(sumS(10))
投稿2020/06/15 10:33
編集2020/06/15 10:49総合スコア1615
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/06/15 11:50
2020/06/15 12:26 編集
退会済みユーザー
2020/06/15 12:30
0
隣接二項間の漸化式なので
Python
1def sumS(n): 2 acc = 2 3 for _ in range(n-1): 4 acc = acc*3 - 1 # Tn = Tn-1 - 1 5 return acc
という風にaccを扱えばよいと思います。
投稿2020/06/15 10:06
編集2020/06/15 10:35総合スコア27
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。