質問するログイン新規登録

回答編集履歴

3

追記

2019/09/21 05:47

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -1,18 +1,68 @@
1
1
  > なぜ-1をするのでしょうか?
2
2
 
3
- 第1項、第2項は既知なので、
4
- 第n項を求める際の計算回数がn-2回で済むから。
3
+ 1項、第2項は既知なので、第n項を求める際の計算回数がn-2回で済むから。
5
4
 
6
- 1を引いているのはカウンタ変数iの初期値を1にしているからです。
5
+ 1を引いているのはカウンタ変数iの初期値を1にしているからです。
7
6
  これを最初から2にしてしまえば while i < count で充分な筈。
8
7
 
9
8
  > fib.append(fib[i] + fib[i-1])
10
9
  i += 1 ここの処理で1.1.2.3.5.8の処理をしているのでしょうか?
11
10
 
12
11
  iにどんな値が入っていて、fib[i]とfib[i-1]が何を指しているのか確認すると良いです。
12
+ ```Python
13
+ def gen_fib():
14
+ count = 10 # とりあえず固定
15
+ i = 1
13
16
 
17
+ # elif count > 2:
18
+ fib = [1,1]
19
+ while i < (count - 1):
20
+ print(f'fib={fib}')
21
+ print(f'i={i}, fib[i]={fib[i]}, fib[i-1]={fib[i-1]}')
22
+ print()
23
+
24
+ fib.append(fib[i] + fib[i-1])
25
+ i += 1
26
+
27
+ print(f'return: {fib}')
28
+ return fib
29
+
30
+
31
+ gen_fib()
32
+ ```
33
+
34
+ **実行結果** [Wandbox](https://wandbox.org/permlink/hO0PhWOcVtizHwWc)
35
+ ```
36
+ fib=[1, 1]
37
+ i=1, fib[i]=1, fib[i-1]=1
38
+
39
+ fib=[1, 1, 2]
40
+ i=2, fib[i]=2, fib[i-1]=1
41
+
42
+ fib=[1, 1, 2, 3]
43
+ i=3, fib[i]=3, fib[i-1]=2
44
+
45
+ fib=[1, 1, 2, 3, 5]
46
+ i=4, fib[i]=5, fib[i-1]=3
47
+
48
+ fib=[1, 1, 2, 3, 5, 8]
49
+ i=5, fib[i]=8, fib[i-1]=5
50
+
51
+ fib=[1, 1, 2, 3, 5, 8, 13]
52
+ i=6, fib[i]=13, fib[i-1]=8
53
+
54
+ fib=[1, 1, 2, 3, 5, 8, 13, 21]
55
+ i=7, fib[i]=21, fib[i-1]=13
56
+
57
+ fib=[1, 1, 2, 3, 5, 8, 13, 21, 34]
58
+ i=8, fib[i]=34, fib[i-1]=21
59
+
60
+ return: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
61
+ ```
62
+
63
+ 余談
14
64
  ---
15
- あんまり良いお手本になるコードには見えません。
65
+ ご提示のコードは、あんまり良いお手本になるようには見えません。
16
66
  再帰処理を避けるとしても、次のように書くのがより簡潔ではないでしょうか。
17
67
  ```Python
18
68
  def make_fib(cnt):

2

追記

2019/09/21 05:47

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -1,9 +1,16 @@
1
+ > なぜ-1をするのでしょうか?
2
+
1
3
  第1項、第2項は既知なので、
2
4
  第n項を求める際の計算回数がn-2回で済むから。
3
5
 
4
6
  1を引いているのはカウンタ変数のiの初期値を1にしているからです。
5
7
  これを最初から2にしてしまえば while i < count で充分な筈。
6
8
 
9
+ > fib.append(fib[i] + fib[i-1])
10
+ i += 1 ここの処理で1.1.2.3.5.8の処理をしているのでしょうか?
11
+
12
+ iにどんな値が入っていて、fib[i]とfib[i-1]が何を指しているのか確認すると良いです。
13
+
7
14
  ---
8
15
  あんまり良いお手本になるコードには見えません。
9
16
  再帰処理を避けるとしても、次のように書くのがより簡潔ではないでしょうか。
@@ -14,4 +21,12 @@
14
21
  fib.append(fib[-1] + fib[-2])
15
22
 
16
23
  return fib[:cnt]
17
- ```
24
+ ```
25
+
26
+ コードの書き方について
27
+ ---
28
+ teratailには、コードを見やすく表示する機能があります。
29
+ 質問編集画面を開き、コードを選択した状態で<code>ボタンを押して下さい。
30
+ ![Python](56957fe805d9d7befa7dba6a98676d2b.gif)
31
+
32
+ 特にPythonの場合、インデントが崩れるとコードの意味が変わってしまいます。

1

追記

2019/09/21 05:40

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -2,4 +2,16 @@
2
2
  第n項を求める際の計算回数がn-2回で済むから。
3
3
 
4
4
  1を引いているのはカウンタ変数のiの初期値を1にしているからです。
5
- これを最初から2にしてしまえば while i < count で充分な筈。
5
+ これを最初から2にしてしまえば while i < count で充分な筈。
6
+
7
+ ---
8
+ あんまり良いお手本になるコードには見えません。
9
+ 再帰処理を避けるとしても、次のように書くのがより簡潔ではないでしょうか。
10
+ ```Python
11
+ def make_fib(cnt):
12
+ fib = [1, 1]
13
+ for _ in range(cnt-2):
14
+ fib.append(fib[-1] + fib[-2])
15
+
16
+ return fib[:cnt]
17
+ ```