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

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

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

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

3回答

7798閲覧

フィボナッチ数列の第n項目を得るプログラムにおける計算の不具合

tarutarupop

総合スコア20

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2017/07/24 11:31

当方つい最近Javaを始めた初心者です。現在javaにてフィボナッチ数列の第n項目を取り出すプログラムを書いています。しかし3以上の入力の際に表示される結果がすべて0になってしまう不具合が起き悩んでいます。不具合の原因と改善点を挙げて説明してもらえると助かります。なお、不具合以外にも改善点があればぜひ指摘してくださって結構です。リンク内容
プログラムはコマンドプロンプト上で動くもので開発環境はEclipseです。

###該当のソースコード

java

1package フィボナッチ数列; 2 3import java.util.InputMismatchException; 4import java.util.Scanner; 5 6public class Fibonacci { 7 /* 8 * フィボナッチ数列の第n項を表示したい 9 */ 10 11 int fibonacci_number[]; 12 int n; 13 14 //実行 15 public static void main(String args[]){ 16 new Fibonacci(); 17 } 18 19 public Fibonacci(){ 20 System.out.println("フィボナッチ数列の第n項を調べてやる、です"); 21 System.out.println("好きな数を打ちやがれ、です"); 22 23 Scanner scan = new Scanner(System.in); //キーイベント 24 try { 25 int input= scan.nextInt(); 26 calculation(input); 27 }catch(InputMismatchException e){ //入力が数字以外の場合 28 System.out.println("数字入れろって言ってるダルォ!?"); 29 return; 30 } 31 32 fibonacci_number = new int[n]; 33 } 34 35 public void calculation(int x){ 36 int n = x; 37 if( n < 3){ //入力が3未満だった場合 38 if(n == 1 ){ //一番目(0)を表示 39 printresult(0,x); 40 } 41 else if(n == 2){ //二番目(1)を表示 42 printresult(1,x); 43 } 44 }else{ //ループに入る 45 fibonacci_number = new int[n--]; 46 fibonacci_number[0] = 0; 47 fibonacci_number[1] = 1; 48 for(int i=0;i<n-2;i++){ 49 int two_before = i; //二個前 50 int before = ++i; //一個前 51 int ans = fibonacci_number[two_before] + fibonacci_number[before]; 52 fibonacci_number[i+2] = ans; 53 } 54 printresult(fibonacci_number[n--],x); //計算結果表示 55 } 56 } 57 //結果を表示する 58 public void printresult(int s,int y){ 59 System.out.println("フィボナッチ数列の第"+ y + "項目の数は"+ s + "です。"); 60 } 61} 62

###試したこと
他の質問サイトにてもアドバイスを受け何とかエラーは出なくなりました。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答3

0

ベストアンサー

難しく考えすぎです。

Java

1public void calculation(int x){ 2 fibonacci_number = new int[(x>1) ? x : 2]; // Math.max(x, 2)でも可 3 fibonacci_number[0] = 0; 4 fibonacci_number[1] = 1; 5 for(int i=2; i<x; i++) { 6 fibonacci_number[i] = fibonacci_number[i-2] + fibonacci_number[i-1]; 7 } 8 printresult(fibonacci_number[x-1],x); //計算結果 9}

++ii++i+1の意味は全部違うということも知っておくべきかと。

Java

1int a, b, c; 2a = b = c = 0; 3 4System.out.println("前置インクリメント"); 5System.out.println(a); // 0 6System.out.println(++a); // 1 7System.out.println(a); // 1 8 9System.out.println("後置インクリメント"); 10System.out.println(b); // 0 11System.out.println(b++); // 0 12System.out.println(b); // 1 13 14System.out.println("普通の加算"); 15System.out.println(c); // 0 16System.out.println(c+1); // 1 17System.out.println(c); // 0

あと、コンストラクタ最終行のfibonacci_number = new int[n];は完全に蛇足です。
せっかく計算したフィボナッチ数列を、初期値で上書きしてしまっています。

投稿2017/07/24 12:08

編集2017/07/25 03:31
LouiS0616

総合スコア35660

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

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

0

大方の処理はLouiS0616さんの回答の通りですが、私としてはこれにインスタンスを作成する必要があることに違和感を覚えます。
本質的に数列なので、項の番号さえわかれば項が確定し、インスタンスの状況によらないはずです。
加えて、すべての処理がコンストラクタ内で行われているのも引っ掛かります。
インスタンスを作成したら、そのインスタンスに対して操作を行うのが本来あるべき姿でしょう。

投稿2017/07/24 18:21

swordone

総合スコア20651

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

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

tarutarupop

2017/07/25 16:25

つまり、この場合はmainのメソッドの中に処理を記述するべきということでしょうか?
swordone

2017/07/25 16:27

そうです。コンストラクタはあくまで「初期化子」であり、初期化中に入力処理などを行うべきではありません。
guest

0

質問文のコードを元に変更してみました。

java

1package SequenceNumbers; 2 3import java.util.InputMismatchException; 4import java.util.Scanner; 5 6public class Fibonacci { 7 public static void main(String args[]) { 8 task(); 9 10 // 計算の確認として、フィボナッチ数列を順番に表示 (20番目まで) 11 for (int i = 1; i <= 20; i++) { 12 System.out.print("" + calculation(i) + " "); 13 } 14 System.out.println(); 15 } 16 17 static void task() { 18 System.out.println("フィボナッチ数列の第n項を調べてやる、です"); 19 System.out.println("好きな数を打ちやがれ、です"); 20 Scanner scan = new Scanner(System.in); // キー入力 21 try { 22 int n = scan.nextInt(); 23 if (1 <= n) { 24 print_result(calculation(n), n); // 計算結果表示 25 } else { 26 System.out.println("1 以上で指定してください"); 27 } 28 } catch (InputMismatchException e) { // 入力が数字以外の場合 29 System.out.println("数字入れろって言ってるダルォ!?"); 30 } 31 } 32 33 static long calculation(int n) { 34 if (n < 2) { 35 return 0; 36 } 37 if (n == 2) { 38 return 1; 39 } 40 long ans = 0; 41 long n1 = 0; 42 long n2 = 1; 43 for (n -= 2; n > 0; n--) { 44 ans = n1 + n2; 45 n1 = n2; 46 n2 = ans; 47 } 48 return ans; 49 } 50 51 static void print_result(long fib, int n) { 52 System.out.println("フィボナッチ数列の第" + n + "項目の数は" + fib + "です。"); 53 } 54}

主な変更点:
パッケージ名は英語にした。
new Fibonacci() をやめて、static メソッドで処理を定義した。
fibonacci_number[] を廃止。(n 番めより前の数値を保存しなくても処理はできるので)
数列を long で計算するようにした。

実行例:
イメージ説明

参考情報

  • Fibonacci sequence

https://rosettacode.org/wiki/Fibonacci_sequence#Java

投稿2018/08/19 04:35

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問