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

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

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

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

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

Q&A

解決済

1回答

2195閲覧

java 再帰処理の戻り値の指定の仕方

kinako_make

総合スコア7

Java

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

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

0グッド

0クリップ

投稿2020/09/30 04:21

編集2020/09/30 23:44

前提・実現したいこと

1.
sortメソッドで、引数で渡した文字列の全パターンの並び順をListに追加していきたいです。
実際は、戻り値を表示させてもなにも追加されていません。
原因がわかりません。

例:123の文字列の全パターンの並び順↓の文字列を1つずつListに追加していきたいです。
123
132
213
231
312
321

2.
sortメソッドで、得た全並び順の数値を比較していきたいです。
今のコードだと隣り合う数値しか比較できませんが、1つとばしや、2つとばしなど
入力されたどんな桁数でも全部の比較をしていきたいです。
どんなアルゴリズムでしていけばいいでしょうか。

追記しました。
最終的にはやりたいことです。
123には、それぞれに下記のように数値が割り振られているので自分よりも大きい数値が前にあれば割り振られた数値を加算していき合計を求めたいです。
1には3
2には2
3には1

例:
123 → 番号順なのでOK
132 → 3が2より大きい → 2
213 → 2が1より大きい → 3
231 → 23が1より大きい → 3+3=6
312 → 3が1,2より大きい → 2+3=5
321 → 3が2より大きい、3,2が1より大きい → 2 + 3+3 = 8

説明がうまくできていなく、わかりずらくすみません。
よろしくお願いいたします。

import

1 2 3public class Main { 4 /* 5 ・1行目に猫の数 N 、許容される不満度の合計 M 6 ・2行目から N 行に、食べる時間 ai と不満度 bi 7 不満度が超えない組み合わせのみ、食事の時間を計算し最小値を比較 8 組み合わせは nPn = n! = n * (n - ) * ... 3P = 3*2*1 = 6通りの並び方がある 9 最小値を表示 10 11 不満度が M を越えないように並び替えた時の食事にかかる時間の合計の最小値を出力 12 */ 13 public static void main(String[] args) { 14 Scanner sc = new Scanner(System.in); 15 16 int catNum = sc.nextInt(); //猫の数 17 int hateMax = sc.nextInt(); //不満度の教養範囲 18 19 int[] eatTime = new int[catNum]; //各猫の食事の時間 20 int[] hate = new int[catNum]; //各猫の不満度 21 String catNo = ""; //各猫につけた番号 22 23 for (int i = 0; i < catNum; i++){ 24 //猫の数分、食事時間と不満度、猫の番号を配列に格納 25 eatTime[i] = sc.nextInt(); 26 hate[i] = sc.nextInt(); 27 catNo += i; 28 29 // System.out.println(eatTime[i] + " " + hate[i] + " " + catNo); 30 } 31 List<String> result = new ArrayList<>(sort(catNo,"",hate)); 32 System.out.println(result); 33 } 34 //全組み合わせを列挙するメソッド 35 /* 36 i番目の文字を抜いた文字列とans+i番目の文字列が、次のpermutationのq, ansになります 37 qは再帰のたびにどんどん短くなり、最終的に1文字になったらansに連結したものが出力されます。 38 i番目を抜いて連結するというのを繰り返すので最終的に全組み合わせを列挙することができます、 39 */ 40 static List<String> sort(String catNo, String ans,int[] hate){ //q=選択候補の文字列、ans=選択済みの文字列 41 42 int len = catNo.length(); 43 //System.out.println("呼び出し:q= " +q + " ans= " + ans); 44 List<String> result = new ArrayList<>(); 45 if(len <= 1) { 46 // System.out.println(ans + catNo); 47 // System.out.println("calcメソッド呼ぶよ"); 48 //String str = ans + catNo; 49 result.add(ans + catNo); 50 // calc(result,hate); 51 }else { 52 53 for (int i = 0; i < len; i++) { 54 //System.out.println("ループ" + i + "回目(q=)" + q + "-------------------------"); 55 //System.out.println( q.substring(0, i) + "," + q.substring(i + 1) + "," + ans + "," + q.charAt(i)); 56 57 sort(catNo.substring(0, i) + catNo.substring(i + 1),ans + catNo.charAt(i),hate); 58 } 59 } 60 61 return result; 62 } 63 //隣り合う不満度を計算するメソッド 64 static void calc(String catNo,int[] hate){ 65 66 int len = catNo.length(); 67 int sum = 0; 68 //隣り合う数値で右の数値のが小さい(=順番を抜かされた)不満度を加算 69 for (int i = 0; i < len; i++){ 70 if(i == len - 1){ 71 break; 72 } 73 //1文字ずつcharをintに変換 74 int left = Character.getNumericValue(catNo.charAt(i)); 75 int right = Character.getNumericValue(catNo.charAt(i + 1)); 76 //不満度を加算 77 //System.out.println(left + " " + right); 78 if(left > right){ 79 sum += hate[right]; 80 } 81 } 82 System.out.println("sum=" + sum); 83 } 84 85} 86コード

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

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

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

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

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

maisumakun

2020/09/30 04:21

で、それをどんなコードに書いて、どのような問題が起きたのでしょうか?
kinako_make

2020/09/30 04:33

すみません。 コードや本文自体途中でした。 訂正しました。
kazuma-s

2020/09/30 12:04

具体的な入力データの例と、期待する出力を書いてほしい。
kinako_make

2020/09/30 23:57

説明がわかりずらくてすみません。 追記しましたが、並び替えたいわけではなく大小の比較だけがしたいです。 並び順はそのままで、隣だけではなく、次は1番目と1つとばした値、その次は2つとばした値と…比較していきたいです。 今思いつきましたが、考え方として、自分の前後の値と比較していけばいいような気がするので考えてみます。
guest

回答1

0

自己解決

解決しました。
Listへの追加は、Listのスコープを考えていなかったのが原因でした。
https://teratail.com/questions/17965

2の比較も基準となる文字をindexOfで要素数を取得し、その要素より前の要素を順番に比較していきました。

コメントをくれた方々、ありがとうございました。

投稿2020/10/01 02:13

kinako_make

総合スコア7

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問