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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

6回答

2909閲覧

プログラムの読み方が分かりません

prog1717nm

総合スコア56

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2016/06/20 14:00

編集2016/07/19 12:58

以下のプログラムの読み方が分からなくて困っています。

public

1 public static int f(int n) { 2 System.out.println(n); 3 int r; 4 if(n==0) r = 1; 5 else r = f(n-1)+1; 6 return r; 7 } 8 9 public static void main(String[] args) { 10 System.out.println(f(2)); 11 } 12} 13

出力結果は、
2
1
0
3

となりました。mainメソッドより最初は2が出力されます。次に、if文を実行しますが、今回はn=0ではないのでr=f(1)+1となります。と、ここまでは理解できました。次に実行するのはreturn文ですよね?実はまだreturn文のことがあまりよく理解できていないのですが、今回の場合はrの値を同じメソッド内に返すのでしょうか?すみません。勉強不足で申し訳ないです。できればプログラムの実行を順序を追って説明してくれたら助かります。宜しくお願いします。

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

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

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

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

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

moonphase

2016/07/19 12:37

コードは ``` で囲むと綺麗に見えます。
guest

回答6

0

簡単な再帰処理については解説を聞くよりも実際に変数に値を入れていったほうが理解できると思いますよ。
中身は単純なif文なので、メソッドについて理解していたらどうなるかわかると思います。
メソッドfに引数2を与えて計算してみてください。

投稿2016/06/20 14:13

yona

総合スコア18155

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

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

0

フィボナッチ数列ですね。
f(2)= f(1) + 1
f(1) = f(0) + 1
f(0) = 1
これを順に解いていくと、下から順に計算することになります。
f(0) = 1
f(1) = 1 + 1
f(2) = 2 + 1

再帰的にどんどん下に戻っていくということですね。
return はこのメソッドの戻り値です。
f(0)の場合は1,f(1)の場合は2,f(2)の場合は3です。

投稿2016/07/21 01:58

y_tochukaso

総合スコア32

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

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

0

再帰的な処理の説明は、こちらのe-cubeさんの回答が非常に明瞭だと思いますのでご参考までに。

投稿2016/07/19 15:16

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

このプログラムのポイントは再帰呼び出しです。

else r = f(n-1)+1;

ここで自分自身のメソッドを呼び出します。

つまりreturn文には行かず、引数nを減らした
別の状態で関数の先頭に戻り、これを繰り返します。

if(n==0) r = 1;

そしてnが0のときにelseが実行されないので、
無限ループに陥らずに止まる仕掛けです。
今度はreturnを繰り返して、最初の呼び出し元に帰ります。

一行ずつ次はどこに進むか、確認していくと理解しやすいです。


たとえると、Webサイトを見るときに、
Webページの文章の途中でリンクを踏み、
そうしてブラウザの新しいタブをどんどん開いていって、
最後のページを読み終えたら、今度はどんどんタブを閉じて、
最初のページまで戻ってくるイメージです。

なぜそんなことをしたいのかと言うと、
状態変数を持たずにループを実現できるので、
関数型プログラミングでのループ処理に使います。

なお自分で書く分には再帰をまったく使わず、
For文などの制御文だけで手続き的に書くことも可能です。

再帰は上から順番でなく複雑な実行順になるので、
初心者のつまずきポイントですが、
プログラムを書くのに必須ではないので、
もし理解が難しければ後回しでも良いと思います。

投稿2016/07/19 14:40

LLman

総合スコア5592

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

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

0

return文は、呼び出し元にその値を返します。

あと、このプログラムは再帰呼び出しと言って、関数f(int)内で関数f(int)を呼び出しています。
再帰呼び出しは少し理解しづらいかもしれませんが、その時の値を関数f(int)に渡しているので、
紙に今の値を書いて呼び出してどうなっているか机上でチェックすると理解しやすいです。

投稿2016/07/19 13:39

moonphase

総合スコア6621

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

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

0

  1. System.out.println(f(2))実行 f(2)によりf起動 n=2
  2. (n=2)System.out.println(n)により2が出力(1行目)
  3. (n=2)nは0ではないのでr = f(n-1)+1実行、f(n-1)によりf起動 n=2-1=1
  4. (n=1)System.out.println(n)により1が出力(2行目)
  5. (n=1)nは0ではないのでr = f(n-1)+1実行、f(n-1)によりf起動 n=1-1=0
  6. (n=0)System.out.println(n)により0が出力(3行目)
  7. (n=0)nは0なのでr = 1実行、そのままf(0)の結果として1が返される
  8. (5.のn=1)f(0)が1を返したので、r=1+1=2 よってf(1)の結果として2が返される
  9. (3.のn=2)f(1)が2を返したので、r=2+1=3 よってf(2)の結果として3が返される
  10. f(2)が3を返したので、System.out.println(f(2))により3が出力(4行目)

投稿2016/06/20 15:30

swordone

総合スコア20649

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問