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

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

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

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

Q&A

解決済

4回答

1601閲覧

漸化式を求めたいがうまくかけない

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2017/08/12 14:05

1 3 7 15・・・という数列のn番目の項を求めたいです。(2^(n-1)ずつ値が増える)

def get_total(n): if n == 1: return 1 else: for i in range(n): x = 2 ** (n-1) y = 1 + x get_total(x) return y

とコードを書いたのですが、nが1番目ではない時のelse以下の表現が思いつきません。再帰呼び出しを使おうと思ったのですが・・・。どのようにかけますか?

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

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

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

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

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

guest

回答4

0

ベストアンサー

a[1] = 1
a[n] = a[n - 1] + 2^(n - 1)

という漸化式を使うのが一つです。
または漸化式を再帰的に適用していくと一般解が導けそうですね

a[n] = 2 ^ (n - 1) + 2 ^ (n - 2) + 2 ^ (n - 3) ・・・ + 1

したがって
**a[n] = 2 ^ n - 1 **
ですね。プログラムで計算する必要なしです。べき乗記号は^としました。

投稿2017/08/12 15:09

HogeAnimalLover

総合スコア4830

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

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

anndonut

2017/08/12 15:18

まー、あなたの言いたいことはわかるんですけどね。問題に、(2^(n-1)ずつ値が増える)と書いてあるのだからそれを愚直に表現してやればいいじゃないですか。最初のうちは楽しくプログラミングできればいいのですよ。
_Victorique__

2017/08/12 15:35

ここは考えの押し付けをする場所ではありません。いろいろな回答があって良い場所です。質問者への気づきにもなります。
anndonut

2017/08/12 15:40

おっしゃるとおりだと思います。すみませんでした。
guest

0

3通りの方法で計算し、値を比較するようにしてみました。

xxx.py

python

1# 繰り返し計算 2def get_total_loop(n): 3 sum = 1 4 for i in range(2, n + 1): 5 sum += 2 ** (i - 1) 6 return sum 7 8# 再帰で計算 9def get_total(n): 10 if n == 1: 11 return 1 12 else: 13 return get_total(n - 1) + 2 ** (n - 1) 14 15 16# 漸化式を解いた結果で計算 17def get_total_c(n): 18 return 2 ** n - 1 19 20for i in range(1, 10): 21 print(str(get_total_loop(i)) + ", " + 22 str(get_total(i)) + ", " + 23 str(get_total_c(i)))

実行結果:

$ python xxx.py 1, 1, 1 3, 3, 3 7, 7, 7 15, 15, 15 31, 31, 31 63, 63, 63 127, 127, 127 255, 255, 255 511, 511, 511

投稿2017/08/13 04:28

katoy

総合スコア22324

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

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

0

漸化式は、a[1] = 1, a[n+1] = a[n] + 2^nですね。
だから、コードはこんな感じになります。

python

1def get_total(n): 2 if n == 1: 3 return 1 4 else: 5 return get_total(n-1) + 2 ** (n-1) 6 7print([get_total(i) for i in range(1, 5)])

投稿2017/08/12 14:56

anndonut

総合スコア667

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

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

0

すみません、上の方の回答が正しかったようです。
追記します。

追記
差別化を図るために簡略化したものを書きました。

python

1def get_n(n): 2 return 1 if n == 1 else get_n(n-1)+2**(n-1)

投稿2017/08/12 15:01

編集2017/08/12 15:07
_Victorique__

総合スコア1392

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

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

anndonut

2017/08/12 15:06

コードは書いたらきちんと実行させましょう。 あと、get_totalをget_total(n)に直して1~4項目を表示させたら[2, 3, 5, 9]になりました。
anndonut

2017/08/12 15:08

まさかreturn 2**n - 1と言いたかったのでは?
_Victorique__

2017/08/12 15:18

結果的にはそういう事ですね。再帰を使うならそちらが正しいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問