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

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

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

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1134閲覧

Swift 再帰関数

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2020/12/17 05:25

func series(n:Int) ->Int{

if n > 0 { return n - series(n: n - 1) }else{ return 0 }

}
print(series(n: 3))
なぜこの再帰関数の結果は2なのでしょうか?

3-2-1=0ではないのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

処理の順番を整理して考えれば理解できるかと。

  1. 3 - 2(再帰実行するため、数値は確定していない)
  2. 2 - 1(再帰実行のため、数値は確定していない)
  3. 1 - 0(再帰処理を行うが、0が返され、再帰はこれ以上実行されないため、確定)
  4. 3番目が確定して、1が返る
  5. 2番目も確定し、2 - 1の式が確定するので、1が返る
  6. 1番目の処理も確定し、3 - 1の式が確定、print(series(n: 3))の処理が確定するため、

2が出力される

という流れだからですね。

投稿2020/12/17 06:06

miyabi_takatsuk

総合スコア9528

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

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

退会済みユーザー

退会済みユーザー

2020/12/17 06:11

series(n:3)→3-(series(n:2))→3-(2-series(n:1))こうゆう事でしょうか?
退会済みユーザー

退会済みユーザー

2020/12/17 06:18

series(n:3)→3-series(n:2)→3-2-series(n:1)なぜこれはこのように括弧が外れるのではなくつくのでしょうか?そこら辺がいまいちわかりません。
miyabi_takatsuk

2020/12/17 06:25 編集

(2-series(n:1))の右側が再起実行のため、3-2がすぐに確定しないからです。 最後の再帰が確定するまで、 3-2の、2は確定しません。
退会済みユーザー

退会済みユーザー

2020/12/17 06:28

series(n:3)→3-series(n:2)→3-2-series(n:1)→3-2-1-series(n:0)→ここでretrun 0が返りようやく2と1が確定するという事でしょうか?確定して3-2-1このままで計算するのはおかしいのでしょうか?
miyabi_takatsuk

2020/12/17 06:34

> retrun 0が返りようやく2と1が確定するという事でしょうか? そういうことです。 再帰をさせることによって、 再帰可能な限り潜っていき、 潜れないところまで来た段階で、 確定した値順に処理が確定していきます。 つまり、処理を実行させた順番と、 逆順に値が確定していく、ということです。 (あくまで今回の処理は)
miyabi_takatsuk

2020/12/17 06:37

3-2-1-0と処理の実行順はこうなりますが、 値の確定順は逆の、 0、1、2、3 の順です。 なので、値の処理順自体は先に確定した側から順番にされます。 1-0、2-1、3-1 という処理順になるわけですね。
退会済みユーザー

退会済みユーザー

2020/12/17 06:40

わかりました!!!ありがとうございます。
miyabi_takatsuk

2020/12/17 06:43

値が確定した式から順に実行される、 と覚えればいいかと。 つまり、必ずしも、処理の実行順に、処理が確定されるとは限らないってことです。
miyabi_takatsuk

2020/12/17 06:44

いえいえ、私も大変勉強になりました。 逆にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問