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

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

新規登録して質問してみよう
ただいま回答率
85.46%
コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

1723閲覧

Pythonでの数列の足し算

退会済みユーザー

退会済みユーザー

総合スコア0

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/06/15 09:51

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ページで確認できます。

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

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

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

skysoul

2020/06/15 10:07 編集

期待値を示してくれると回答しやすくなります T1=2, Tn=3Tn-1-1 とはどういうことでしょうか?
guest

回答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 が表示されます。

そして、上記のコードをあらためて見直してリファクタリングし、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

もちろん、ひとつ前の項を入れておく変数(ここでは prevT)を使わないコードを、初めから書けるようになればそれに越したことはありません。

さらに、数列Tnの初項2t の初期値として代入しておけば、t = 3 * t - 1 if n > 1 else 2if 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))

投稿2020/06/15 10:18

編集2020/06/15 12:08
jun68ykt

総合スコア9058

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

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

退会済みユーザー

退会済みユーザー

2020/06/15 11:39

ありがとうございます。2つ質問があります。 1つは t = 3 * prevT - 1 if n > 1 else 2 t = 3 * prevT - 1 if n > 1 else 2 prevT, acc = t, acc + t とありますが、if文が右のこの位置にきているものはみたことがありません。 n>1ければ続けて、ここではn=1のときは2をいれるということでしょうか? そのしたに3つ並んでいる prevT, acc = t, acc + t とはn>1ならば以下を実行ということでしょうか? 2つ目はみなさん当たり前のようにprevTは消せるというのですが、どこでprevT=tになっているのかがよくわからりません。すみません、構文の仕組みがよくわかっていないのかもしれません。
jun68ykt

2020/06/15 12:26 編集

コメントありがとうございます。質問に回答します。 (1) t = 3 * prevT - 1 if n > 1 else 2 【回答】 以下に説明があります。 6.13. 条件式 (Conditional Expressions) https://docs.python.org/ja/3/reference/expressions.html#conditional-expressions 以下は上記からの引用です。 --- x if C else y という式は最初に条件 x ではなく C を評価します; C が true の場合 x が評価され値が返されます; それ以外の場合には y が評価され返されます。 --- 上記に従えば、 t = 3 * prevT - 1 if n > 1 else 2 の右辺の式は「 n が 1より大きければ 3 * prevT - 1、 そうでなければ 2 」となり、これが左辺の t に代入されます。 (2) prevT, acc = t, acc + t 【回答】 この、 prevT, acc = t, acc + t という一行は、以下の2行を一行に書いたものと思って差し支えありません。 prevT = t acc = acc + t すなわち、 a = x b = y という2行は、以下の一行で書けます。 a, b = x, y (3) どこでprevT=tになっているのか 【回答】 prevT, acc = t, acc + t で行っています。 上記の(2) で説明したとおり、 prevT, acc = t, acc + t という一行は、以下の2行を一行に書いたものと思って差し支えないです。 prevT = t acc = acc + t 以上です。
退会済みユーザー

退会済みユーザー

2020/06/15 12:37

ご丁寧に解説していただき、本当にありがとうございます。 表記方法もいろいろあることを知らず、意味がつかめず大変しつれいいたしました。 また別の方の説明でイコールの意味がようやくわかりました。 通常の右と左が等しいという意味ではなく、右辺の結果を左の変数に代入するということだったようで、それがわからずかなり混乱していました。 色々苦労しており、また質問すると思いますがよろしくお願いします。 ありがとうございました。
jun68ykt

2020/06/15 12:41

どういたしまして???? また回答できそうなご質問があれば回答させて頂きますねー????
guest

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
yymmt

総合スコア1615

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

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

退会済みユーザー

退会済みユーザー

2020/06/15 11:50

ご丁寧にありがとうございます。 最初の2つは式に沿っているのでなるほどとよくわかります。 分からなくなるのはTn-1が消せるということです。 Tn-1の値はどこでTに置き換わっているのでしょうか? 例えばn=2の場合、 T = 3*T - 1 ですが、T=3*2-1=5と右辺だけ計算してT=と考えてしまっていいのですか? そのあたりがよくわからず混乱している気がします。 うまくお伝え出来ないのですが、T=T-1と置き換えている部分はどこになるのかが今一つわかりません。 度々すみませんがお時間があればよろしくお願いします。
yymmt

2020/06/15 12:26 編集

> T=3*2-1=5と右辺だけ計算してT=と考えてしまっていいのですか? はい、その通りです。同様にacc += Tというのも acc = acc + T の省略形でaccを新しい計算結果で上書きしています。 イコールの記号は「右で計算した結果を左の変数に代入する」という意味を持っています。したがって右の計算過程に含まれている変数は古い値で、左の方が新しく計算された値になります。
退会済みユーザー

退会済みユーザー

2020/06/15 12:30

ありがとうございました。 基本的なことですが、イコールの意味がよくわかっていなかったため、混乱が生じていた気がします。 右辺の結果を左の変数に代入と考えるのですね。 とてもよくわかりました。考えかたの展開も大変参考になりました。 ただ、実際別の問題を自分でやるとなるとまた難しいです。また別途質問するかもしれませんが、その際はよろしくお願いします。
guest

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
calliope

総合スコア27

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問