解答編5
「再帰関数,標準入力ストリーム」
 
← 前  :  次 →

問1の解答.

「Fib.java」

public class Fib {
	public static void main(String[] args) {
		Fib f;
		int userNum;

		// 引数のエラー判定1(あるかないか)
		if(args.length!=1) {
			System.out.println("引数ないよ or 多いよ");
			System.exit(1);
		}

		// 引数のエラー判定2(自然数かどうか)
		try {
			userNum=Integer.parseInt(args[0]);
		} catch(NumberFormatException nfe) {
			userNum=-1;
		}
		if(userNum<0) {
			System.out.println("正の整数じゃないよ");
			System.exit(1);
		}
		System.out.println("ユーザ入力:"+userNum);

		// 自身のインスタンス生成
		f=new Fib();
		// 再帰呼び出し しまくり
		for(int i=0;i<userNum;i++) {
			System.out.print(f.fib(i)+",");
		}
		System.out.println(f.fib(userNum));
	}

	public int fib(int i) {
		if(i==0) {
			// f(0)=0 という条件
			return 0;
		} else if(i==1) {
			// f(1)=1 という条件
			return 1;
		}

		// f(i)=f(i-1)+f(i-2)  : i>1 という条件
		return fib(i-1)+fib(i-2);
	}
}


問2の解答.
ベルくん(仮称)の回答(反転させて出力する部分)が,シンプルで良いです.

	for(int i = ouputStr.length()-1; i >=0; i--) {
		System.out.println(outputStr.charAt(i));
	}
良いですが,せっかくなので違った解答を用意してみました.
「InputString.java」
import java.io.*;

public class InputString {
	/**
	 * 標準入力ストリームを保持するインスタンス変数.
	 */
	private BufferedReader inputReader;

	/**
	 * コンストラクタ.
	 */
	public InputString() {
		// 標準入力ストリーム(System.in)から InputStreamReader を生成
		// さらに,そのインスタンスから入力効率の良い BufferedReader を生成
		inputReader=new BufferedReader(new InputStreamReader(System.in));
	}

	/**
	 * @return ユーザ入力文字列
	 * 
	 * 標準入力ストリームから文字列を取得するメソッド.
	 */
	public String getUserInput() {
		String userStr;

		try {
			// 標準入力ストリームからユーザが入力した文字列を取得
			userStr=inputReader.readLine();
		} catch(IOException ioe) {
			// I/O 例外が起きた場合には,ユーザ入力は空
			userStr="";
		}

		return userStr;
	}

	/**
	 * @param args コマンド・ライン引数
	 * 
	 * メイン・メソッド.
	 */
	public static void main(String[] args) {
		InputString is;
		String userStr;
		String resultStr;

		// 自身のインスタンスを生成
		is=new InputString();

		// ユーザ入力
		System.out.print("Input :");
		userStr=is.getUserInput();
		System.out.println("");

		// 反転出力
		resultStr=new String(is.reverseArray(is.convertStringToArray(userStr)));
		System.out.println("Output:"+resultStr);
	}

	/**
	 * @param srcStr 対象文字列
	 * @return 対象文字列から作成した文字配列
	 * 
	 * 文字列から文字配列を取得するメソッド.
	 */
	public char[] convertStringToArray(String srcStr) {
		char[] dstArray;

		// 配列の確保
		dstArray=new char[srcStr.length()];
		// 文字列から文字配列へ文字をコピー
		srcStr.getChars(0,srcStr.length(),dstArray,0);

		return dstArray;
	}

	/**
	 * @param srcArray 対象文字配列
	 * @return 対象文字配列を反転させた文字配列
	 * 
	 * 文字配列から逆順文字配列を取得するメソッド.
	 */
	private char[] reverseArray(char[] srcArray) {
		char[] dstArray;
		int arrayLength;

		// 配列の長さを取得
		arrayLength=srcArray.length;
		// 配列の確保
		dstArray=new char[arrayLength];
		// 反転
		for(int i=0;i<arrayLength;i++) {
			dstArray[i]=srcArray[(arrayLength-1)-i];
		}

		return dstArray;
	}
}

ムダに長くなってしまいました・・・.


表紙へ戻る