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

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

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

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

Q&A

解決済

2回答

1036閲覧

フィボナッチ文字列(ABを使ったもの)

sui11

総合スコア1

Java

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

0グッド

0クリップ

投稿2022/01/19 05:02

編集2022/01/19 07:27

フィボナッチ文字列https://www.iss.is.tohoku.ac.jp/stringology/Strings/Fibonacci/index.html

Fib1=b
Fib2=a
Fib3=ab
Fib4=aba
Fib5=abaab
Fib6=abaababa
Fib7=abaababaabaab
Fib8=abaababaabaababaababa
Fib9=abaababaabaababaababaabaababaabaab
Fib10=abaababaabaababaababaabaababaabaababaababaabaababaababa
Fibn は, Fibn−1 に対して次の規則に従った変換を行うことにより生成することもできる. ただし, Pd0=a とする.
a→ab
b→a 
〇javaのStringBufferクラスと上の規則使って上記の表を作りたいです。Fib=4以降が間違っているようです。
2日考えてわからないですが理解したいです。解説していただきたいです。(fib1 = Aで作りたいです)
〇追記:具体的にはfor文とreplace()等を使って繰り返し変換し、 表を作りたいというもので、 Fib4=ABAABとなるようにしたいのですがうまくいきません。 期待する結果になるにはFib4の場合 Fib3=ABAの1番目のAをAB ,2番目のBをA,3番目のAをABに変換するのですがFib4=ABAAとなっており3番目の変換がされていないと思います。 最終的に、一つの文字列に対して2種類の変換を複数回を行うfor文の作り方がわからないです。なのでそのアドバイスをいただきたいです。
java

考えたコード public class fibw { public static void main(String[] args){ StringBuffer f = new StringBuffer("B"); for(int i = 1; i<=10;++i){ for(int x=0;x<=f.length()-1;++x){ char chAB = f.charAt(x); if(chAB == 'A')f.replace(x,x+1,"AB");x=x+1; if(chAB == 'B')f.replace(x-1,x,"A"); } System.out.println("Fib"+i+"= "+f); } } } 実行結果 Fib1= A Fib2= AB Fib3= ABA Fib4= ABAA Fib5= ABAAAB Fib6= ABAAABABA Fib7= ABAAABABAAAA Fib8= ABAAABABAAAAABABAB Fib9= ABAAABABAAAAABABABABAAAAA Fib10= ABAAABABAAAAABABABABAAAAAAAAABABABAB

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

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

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

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

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

jimbe

2022/01/19 05:19

>2日考えてわからない 何をどのように2日考えて、結局何が分からないのでしょうか。 "xxという用語が分からない", "xxという命令がどう動作しているのか分からない"等、具体的にお願いします。 >解説していただきたい 何を解説するのでしょうか。 フィボナッチ文字列ならお分かりでしょうし、ご自身で作ったコードならお分かりのはずですが…。
Zuishin

2022/01/19 06:07 編集

replace なんか使ってるからじゃないですか? Fib4 は ABAAB が正解ですが、これは Fib3(ABA) + Fib2(AB) で求められ、replace を使う余地などありません。 アルゴリズムは数字を使ったものと全く同じものでできます。 StringBuffer ではなく、ArrayList を使うと良いでしょう。
sui11

2022/01/19 06:22

失礼しました。具体的にはfor文とreplace()等を使って繰り返し変換し、 表を作りたいというもので、 Fib4=ABAABとなるようにしたいのですがうまくいきません。 期待する結果になるにはFib4の場合 Fib3=ABAの1番目のAをAB ,2番目のBをA,3番目のAをABに変換するのですがFib4=ABAAとなっており3番目の変換がされていないと思います。 最終的に、一つの文字列に対して2種類の変換を複数回を行うfor文の作り方がわからないです。なのでそのアドバイスをいただきたいです。
sui11

2022/01/19 06:23

zuishinさんありがとうございます。試してみます。
guest

回答2

0

ベストアンサー

一つの文字列に対して2種類の変換を複数回を行うfor文の作り方

ご提示のコードの問題は、結果的に for のループ一回につき 2 種類の置換を同時に行ってしまっている点と思います。本来は for のループ一回につき 2 種類の置換のどちらかを行うことのはずです。

chAB の if 文が連続して実行可能であったり、 'A' の x=x+1 が if 文の外にあったり、(その為に?) 'B' の置き換え位置が変だったりで、置き換えが sui11 さんの想定のようには行われていないと思います。

次のように書けます。

java

1public class fibw { 2 public static void main(String[] args){ 3 StringBuffer f = new StringBuffer("B"); 4 for(int i = 1; i<=10;++i){ 5 for(int x=0;x<f.length();++x){ 6 char chAB = f.charAt(x); 7 if(chAB == 'A') { 8 f.replace(x,x+1,"AB"); 9 x ++; 10 } else if(chAB == 'B') { 11 f.replace(x,x+1,"A"); 12 } 13 } 14 System.out.println("Fib"+i+"= "+f); 15 } 16 } 17}

もう少し整理するとこんな感じにも。

java

1public class fibw { 2 public static void main(String[] args) { 3 StringBuffer f = new StringBuffer("B"); 4 for(int i=1; i<=10; i++) { 5 for(int j=0; j<f.length(); ) { 6 String str = f.charAt(j) == 'A' ? "AB" : "A"; 7 f.replace(j, j+1, str); 8 j += str.length(); 9 } 10 System.out.println("Fib"+i+"= "+f); 11 } 12 } 13}

投稿2022/01/19 07:08

編集2022/01/19 07:41
jimbe

総合スコア12648

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

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

sui11

2022/01/19 07:16

ありがとうございます。勉強させていただきます
guest

0

後ろから置換すればよいのでは?

java

1public class fibw { 2 public static void main(String[] args) { 3 StringBuffer f = new StringBuffer("B"); 4 for (int i = 1; i <= 10; i++) { 5 System.out.println("Fib" + i + "= " + f); 6 for (int x = f.length(); --x >= 0; ) // 後ろから置換 7 f.replace(x, x+1, f.charAt(x)=='A' ? "AB" : "A"); 8 } 9 } 10}

投稿2022/01/19 08:52

kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問