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

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

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

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

Q&A

解決済

4回答

194閲覧

このreturnの意味

tonta5

総合スコア16

Python

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

0グッド

0クリップ

投稿2018/09/22 04:32

pythonでフィボナッチ数列を作成する関数で

def simFib(n):
if ( n<=1 ):
return 1
else:
return simFib(n-2) + simFib(n-1)

のような例をネットで見つけました。

ここで上から3行目のreturn 1の意味が分かりません(特に1とは何を指しているのでしょうか?)。
再帰に関する事らしいのですが、nが1以下だったら何をreturnしているのでしょうか?
初心者質問で申し訳ございませんが、分かる方がいればご教示お願いいたします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

1件目と2件目の1を返しています。

0 1 2 3 4 5 ↓ ↓ ↓ ↓ ↓ ↓ 1 1 1+1 1+2 2+3 3+5

投稿2018/09/22 04:46

hichon

総合スコア5737

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

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

tonta5

2018/09/22 05:20

一番シンプルなご回答でしたが、一番ピンと来ました。 ただ後でよく見ると他のお二人も同じ事をおっしゃっていたんですね。 しかし1件目と2件目の1を返している、と行列を対比してすぐに分かりました。 ありがとうございました!
guest

0

Pythonはインデントで論理構造を示すので、質問者さんの書き方だと他の者が読めません。こうでしょうか。

Python

1def simFib(n): 2 if ( n<=1 ): 3 return 1 4 else: 5 return simFib(n-2) + simFib(n-1)

return 1 で返しているのは数値(int型)の1です。

nが1より大きいときは、n-2, n-1 を引数に simFib を呼び出しているので、永遠に(nがマイナスになっても) simFibを呼び出し続け、止まらなくなってしまいます。
n<=1 の時に返す値を強制的に1にすることで、さらなる再帰呼び出しを止める条件としているのです。

(試しに、この部分を省いた状態で実行してみても面白いと思います)

投稿2018/09/22 04:53

morinatsu

総合スコア395

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

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

tonta5

2018/09/22 05:11

失礼いたしました。 ありがとうございました!
guest

0

例えば、n = 3の時を見てみましょう。

.n = 3elseに入り、simFib(1) + simFib(0) が返されます。

そこで

python

1 2if ( n<=1 ): 3 return 1

によって、n <= 1の時は1returnされsimFib(1) + simFib(0) = 1 + 1 = 2となり、結果n = 3の時2returnされるわけです。

python

1if ( n<=1 ): 2 return 1 

再帰でいうゴールのようなものです、これがないとwhile文でいう「無限ループ」に陥ります。

投稿2018/09/22 04:47

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tonta5

2018/09/22 05:18

ありがとうございます!
退会済みユーザー

退会済みユーザー

2018/09/22 08:12

>再起で言うゴール すごくわかりやすい説明ですね! else:文がぐるぐる回って最後にif:文で締めるということですね。
guest

0

参考情報

  • 再帰関数を理解するための最もシンプルな例

https://qiita.com/jumpyoshim/items/20e6b5e70efa466699b4

...
再帰法は、再帰終了条件を持たなければならない。
再帰法は、状態を変えながら再帰終了条件に進んでいかなければならない。
再帰法は、再帰的に関数自身を呼び出さなければならない。
...

質問にあるコードの場合は、
終了条件が if (n <= 1): return 1 です。
return simFib(n-2) + simFib(n-1) として、 n を -2 や -1 しながら
再帰呼出ししているので、着実に終了条件 ( n <= 1) に近づいて行くことがわかります。

n をつぎのような規則で変化させた場合は、n が増減しながら変化するので本当に数列が終了するかがが不明ですが大抵は終了するなんて例もあります。
コラッツ数列 https://qiita.com/hoxo_m/items/cce03b093f654df126b0

投稿2018/09/22 10:09

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問