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

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

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

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

Q&A

解決済

2回答

506閲覧

フィボナッチのウサギ:効率的なプログラム表示の方法

rprprp

総合スコア5

Python 3.x

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

0グッド

0クリップ

投稿2019/08/27 02:22

前提・実現したいこと

フィボナッチのウサギをpython3で表示したいです。
(出生0ヶ月なら'.', それ以外なら'*')

一応の形は出来たのですが、
for文が多く、冗長なコードのように思えます。
より効率的な書き方はありますか?
参考URL

該当のソースコード

python3

1def fibonacci(n, x): 2 tmp = [] 3 for i in range(len(x)): 4 if x[i] == True: 5 x[i] = False 6 else: 7 tmp.append(i) 8 9 for i in range(len(tmp)): 10 x.insert(tmp[i]+(i+1),True) 11 print('') 12 13 return x 14 15def print_(x): 16 for i in range(len(x)): 17 if x[i] == True: 18 print('.',end='') 19 else: 20 print('*',end='') 21 return 22 23x = [True] # 生まれて0ヶ月かどうか 24for i in range(6): 25 print_(x) 26 x = fibonacci(i,x)

出力

. * *. *.* *.**. *.**.*.*

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

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

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

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

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

guest

回答2

0

ベストアンサー

ここまでするとやりすぎか。

Python

1x = '.' 2for i in range(10): 3 print(x) 4 x=''.join([['.*','*'][v=='.'] for v in x[::-1]])[::-1]

--
追記前を踏まえつつ文字列のみで処理すると、もう少し簡潔に書けます。

Python

1def fibonacci(x): 2 ret = '' 3 for v in x[::-1]: 4 ret += ['.*','*'][v == '.'] 5 return ret[::-1] 6 7x = '.' 8for i in range(10): 9 print(x) 10 x = fibonacci(x)

追記前

  • 逆順で処理すると、末尾に追加するだけなので簡単になります。
  • 次の状態を[[True,False],[False]]のようなリストで持っておくとそのまま足すだけでよくなります。

Python

1def fibonacci(x): 2 ret = [] 3 for v in reversed(x): 4 ret += [[True,False],[False]][v] 5 return list(reversed(ret)) 6 7x = [True] 8for i in range(10): 9 [print('*.'[v], end='') for v in x] 10 print('') 11 x = fibonacci(x) 12""" 13. 14* 15*. 16*.* 17*.**. 18*.**.*.* 19*.**.*.**.**. 20*.**.*.**.**.*.**.*.* 21*.**.*.**.**.*.**.*.**.**.*.**.**. 22*.**.*.**.**.*.**.*.**.**.*.**.**.*.**.*.**.**.*.**.*.* 23"""

投稿2019/08/27 11:20

編集2019/08/27 12:36
can110

総合スコア38262

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

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

rprprp

2019/08/30 06:50

文字列だけの処理、思いつきませんでした...! 学ばさせていただきました。本当にありがとうございます。
guest

0

フィボナッチ数列の一般項は
Fib(n)=1/√5{((1+√5)/2)^n−(1-√5)/2)^n}
ですからこれが一番効率的です。再帰もループも不必要です。
原理からpythonでの実装まで細かに解説しているページがQiitaにありましたので貼っておきます。
参考サイト

投稿2019/08/27 09:11

satocha

総合スコア336

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問