プロが教える店舗&オフィスのセキュリティ対策術

def fib(x):
for n in range(x):
 if n == 1: return 0
 elif == 2: return 1
 else: return fib(n-1)+fib(n-2)
print(fib(10))

これをやるとググってもヒットしない謎のメッセージが出るのですが、どこがおかしい教えて下さい。

A 回答 (8件)

def fib(n):


 for i in range(n):
  if i == 0:
   return 0
  elif i == 1:
   return 1
  else:
   return fib(n-1) + fib(n-2)

fib(10)
ですね。

先の回答でも書きましたが
> for i in range(n):
だとforの最初のiは常に0です。
そしてif i==0:が選ばれ、return 0 で返ってしまいます。
for文の中でreturnしてしまうとループしないのです。
    • good
    • 0
この回答へのお礼

for文でreturnするとループしないのですね、知りませんでした。勉強になりました、ありがとうございます。他の質問も色々あるので、またよろしくお願いいたします。

お礼日時:2019/11/11 22:27

>単純にこの2つの違いが分からないです。



単純に-行ー行追って行けばまるで動きが違うことは
直ぐに分かりますよ。

forを関数の内側に入れただけという
形式的な考え方なんでしょうけど、
それは再帰関数には通用しない。

実行を一つ一つ追って見るという
ことが出来ないと、プロブラムは
上達しません。
    • good
    • 0

インデントがちゃんとしていれば


invalid syntax(文法違反)
とでるだけのはず。

4行目→elifの論理式の==の左がない。

のが原因。

しかし、これを直しても動きませんよ。
この再帰とforが混じった謎のアルゴリズムは何処から
捻り出したんですか?
    • good
    • 0
この回答へのお礼

インデントはコピペでおかしくなってしまったようです。あと簡単なタイポも失礼しました。

他の方にも質問させて頂きましたが、

def fib(n):
if n == 0:return 0
elif n == 1:return 1
else:return fib(n-1)+fib(n-2)

for n in range(11):
print(fib(n))

は正常にWorkするのに、

def fib(n):
for i in range(n):
if i == 0: return 0
elif i == 1: return 1
else: return fib(n-1) + fib(n-2)
fib(10)

この出力が0になるのはなぜでしょうか?
単純にこの2つの違いが分からないです。

お礼日時:2019/11/11 20:51

ANo.4です。

forがいらんかったわ。
def fib(n):
 if n == 1:
  return 0
 elif n== 2:
  return 1
 else:
  return fib(n-1)+fib(n-2)

print(fib(10))
表示の都合でインデントは全角空白にしているので半角空白に置き換えて下さい。

あと質問するときは『謎のメッセージ』じゃなくてメッセージそのものを書こうね。
質問文通りだとインデントがおかしいので文法違反になるし、適当に修正してもいろいろと間違っているので『謎のメッセージ』が何を指しているのか推測するだけで大変なので。
> for n in range(x):
この書き方だとPythonではnは0から始まります。それで文法レベルの間違いを適当に修正したらn=0から fib(n-1)+fib(n-2) は fib(-1)+fib(-2) なって、range(-1)は空リストなのでfib(-1)は値を返さなくてエラーになります。
forの中で簡単にreturnしたらダメですよ。指定した数値以下の数列を計算してリストで返すなら例えば次のようにします。

def fib(m):
 ret = []
 for n in range(m):
  if n==0:
   ret.append(0)
  elif n==1:
   ret.append(1)
  else:
   ret.append(ret[n-1]+ret[n-2])
 return ret

print(fib(10))
表示の都合でインデントは全角空白にしているので半角空白に置き換えて下さい。
    • good
    • 0
この回答へのお礼

コードをコピペしたらインデントがおかしくなってしまったようです。
あの後私も空のリストつくってそこに順次足していくというコードでWorkするものが書けました。
追加で質問なのですが、下記のコードの問題点もご指摘頂けないでしょうか?
def fib(n):
for i in range(n):
if i == 0: return 0
elif i == 1: return 1
else: return fib(n-1) + fib(n-2)
fib(10)
出力が0となってしまうのですが、その理由が分かりません。

お礼日時:2019/11/11 20:44

本当に質問通りに書いたの?


Pythonって改行とインデントが文法に含まれるので、こんな書き方だと文法違反が多数出ると思うけど。
def fib(x):
 for n in range(x):
  if n == 1:
   return 0
  elif n == 2:
   return 1
  else:
   return fib(n-1)+fib(n-2)
 print(fib(10))
表示の都合でインデントは全角空白にしているので半角空白に置き換えて下さい。
    • good
    • 0

elif のところ, これでいいのかなぁ.



range(x) で出てくるのが
0 以上 x 未満の値
で, さいしょに n=0 になるから困ってるんじゃないかねぇ.

まあ range(1, x+1) にしても n=1 でいきなり return しそうだけど.
    • good
    • 0
この回答へのお礼

なるほど、最初にn == 0で、else以下の指示を実行しようとしてエラーになるというわけですね。勉強になります。

お礼日時:2019/11/11 20:09

No.1です。



Pythonもそれほどやってないので不明な点はありますが、print文の内容として適切ではない(何故繰り返しが行われているの?)からかなって思います。
なので普通にfor文を使う手段しかわかりません。

print(fib(10))

の代わりに

for x in range(1,11):print(fib(x)) # 10までなら指定は11。0はダメなので最初は1。
    • good
    • 0
この回答へのお礼

上のコードで正しくWorkしました。
他の方にも回答させて頂きましたが、range(10)にすると最初のn==0の時にelse以下を実行してエラーが出てしまうのですね。

追加質問についてですが、
[fib(n) for n in range(1,11)]
だと数列が出力されるのですが、この仕組みが分からないです。
forの最後に:もつけなくて良いのも初めてみました。
リストではなく、書きの通りだとやはりWorkしません。
fib(n) for n in range(1,11)
リスト型の機能の一つなのでしょうか。

お礼日時:2019/11/11 20:18

def fib(n):


 if n == 1:return 0
 elif n == 2:return 1
 else:return fib(n-1)+fib(n-2)

print(fib(10)) #34

こうではないの?
https://qiita.com/dovedove/items/3456c4f317a5c68 …

for文は関数の中に書くものではないと思うし、受け取る際の変数名とその後に使用している変数名が違うし。
    • good
    • 0
この回答へのお礼

早速ありがとうございます。
添付リンクを参照して、他のやり方で下記直せないかと思って上のコードを試しています。
n番目までの数列を示す様なコードをfor文で書きたいです。関数の中にfor文使う事はよくありますよね?

追加で質問なんですが、リンクだと、リスト型として出力してますが、リスト型にしないで書くとエラーが出るのは何故でしょうか?

お礼日時:2019/11/10 14:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!