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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

7313閲覧

c# 再帰呼び出しの挙動がよく分かりません

drer

総合スコア20

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2016/08/26 07:10

編集2016/08/26 07:13

現在再帰呼び出しの勉強をしているのですが、どうも難しく理解できておりません

c#

1class Program 2 { 3 static void Main(string[] args) 4 { 5 Sum(5); 6 } 7 8 static int Sum(int n) 9 { 10 if (n == -200) return 1; 11 Console.WriteLine(n); 12 System.Threading.Thread.Sleep(100); 13 int result = Sum(n - 1) + n; 14 Console.WriteLine("..." + result); 15 return result; 16 } 17 }

このプログラムなのですが、結果は
5から-199 ...-198から...-19884と表示されます。

私は再帰呼び出しはこんな風にとらえているのですが、

c#

1Sum(5) 2 { 3 ....... 4 int result = Sum(4) { //この時点でよびされる 5 ....... 6 int result = Sum(3) { 7 8 } +n; 9 } +n; 10 }

この考えでいくと5から-199まで表示されたあと、return 1;で、int result = Sum(-200)に1が返され、int result = 1 + -199となり、次はSum(-199)に-198が返され、-198-199で...-397が表示されて...と思うのですが、どこが間違っているのでしょうか。
教えて下さい

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

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

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

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

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

guest

回答2

0

ベストアンサー

再帰呼び出しの動きはコードだけを見ていると想像しにくいので、図にしてみるのが良いです。

sum(5)からsum(-200)までを回答に書くのは大変なので、質問のコードの

if (n == -200) return 1;

if (n == 0) return 0;

に書き換えたもので、動作を追ってみましょう。

  1. 最初は、sum(5)の呼び出しから始まります。

画面に「5」を表示した後で、sum(4)を呼び出します。
2) sum(4)
画面に「4」を表示した後で、sum(3)を呼び出します。
3) sum(3)
画面に「3」を表示した後で、sum(2)を呼び出します。
4) sum(2)
画面に「2」を表示した後で、sum(1)を呼び出します。
5) sum(1)
画面に「1」を表示した後で、sum(0)を呼び出します。
6) sum(0)
0を返す。(WriteLineの手前で返るので画面には何も出ません)
7) sum(1)の続き
0+1を計算して、resultに代入。画面に「...1」を表示。1を返す。(1は、0+1の計算結果)
8)sum(2)の続き
1+2を計算して、resultに代入。画面に「...3」を表示。3を返す。
9)sum(3)の続き
3+3を計算して、resultに代入。画面に「...6」を表示。6を返す。
10)sum(4)の続き
6+4を計算して、resultに代入。画面に「...10」を表示。10を返す。
11)sum(5)の続き
10+5を計算して、resultに代入。画面に「...15」を表示。15を返す。

これをゆっりと呼んでいくと、どのように動作するのか判るのではないでしょうか。

投稿2016/08/26 08:03

coco_bauer

総合スコア6915

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

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

drer

2016/08/26 13:52

コード自体は読めるようになりましたが、再帰呼び出し自分で考えてコードにするのって相当難しくないですか?
coco_bauer

2016/08/28 11:39

引数がnの関数の値を、nより小さい引数の関数の値を使って表現できれば、再帰呼び出しを使ったコードにできる事が多いです。 質問のコードでは、Sum(n) = Sum(n - 1) + n;が成り立つので、再起呼び出しで実現できました。
guest

0

あ、すみませんでした
Sum(-199)でresult=1+-199=-198ならSum(-198)でresult=-198-198=-396ですね
ごめんなさい、勘違いしてました!

投稿2016/08/26 07:36

drer

総合スコア20

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問