私は宿題をしています。指定された番号 (list2) を昇順で並べ替える再帰の基本ケースを作成したいと思います。このコードを記述する目的は、すべての数値が昇順になっている場合に、ascending(list2, list1); というメソッドの呼び出しを停止することです。list2 のすべての値を list1 に送信する必要があります。たとえば、list2 = 6,5,4,3,2,1 の場合、list2 は空になり、list1 は 1,2,3,4,5,6 になります。結果を前の結果と比較しようとしていますが、一致する場合は停止します。しかし、それを止める基本的なケースが見つかりません。なお、ascending() と fixedPoint() はどちらも void メソッドです。誰でもアイデアがありますか?笑 3日かかりました…
コードを実行すると
6,5,4,3,2,1
5,6,4,3,2,1
4,5,6,3,2,1
3,4,5,6,2,1
2,3,4,5,6,1
1,2,3,4,5,6
1,2,3,4,5,6
1,2,3,4,5,6
1,2,3,4,5,6
1,2,3,4,5,6
無限.............
public class Flipper
{
public static void main(String[] args)
{
Flipper aFlipper = new Flipper();
List<Integer> content = Arrays.asList(6,5,4,3,2,1);
ArrayList<Integer> l1 = new ArrayList<Integer>(content);
ArrayList<Integer> l2 = new ArrayList<Integer>(); // empty list
aFlipper.fixedPoint(l2,l1);
System.out.println("fix l1 is "+l1);
System.out.println("fix l2 is "+l2);
}
public void fixedPoint(ArrayList<Integer> list1, ArrayList<Integer> list2)
{
// data is in list2
ArrayList<Integer> temp1 = new ArrayList<Integer>(); // empty list
if (temp1.equals(list2))
{
System.out.println("found!!!");
}
else
{
ascending(list2, list1); // data, null
temp1 = list1; // store processed value
System.out.println("st list1 is "+list1);
System.out.println("st list2 is "+list2);
}
fixedPoint(list2, list1); // null, processed data
}
アドバイスを受けて二度目のトライ。
else {
temp1 = list2;
System.out.println("temp1: "+temp1);
// temp1 は割り当てられた値を出力しました
// store only previous value
ascending(list2, list1); // data, null
temp2 = list1;
// store previous value
System.out.println("temp1: "+temp1);
// ascending() を呼び出した後、temp1 は空になります (笑) if ステートメントで比較できません.... 誰か修正できますか?
System.out.println("temp2: "+temp2);
}
fixedPoint(list2, list1); // previous, proceeded data
dasblinkenlight、Julien S、Nikolas、ZouZou、vels4j とのブレイン ストーミングの後、解決策が見つかりました。あなたの考えへの貢献に感謝します!:-)
public void fixedPoint(ArrayList<Integer> list1,
ArrayList<Integer> list2)
{
List<Integer> content = Arrays.asList(1);
ArrayList<Integer> temp1 = new ArrayList<Integer>(content);
fixedPoint(list2, list1, temp1);
}
// Since it is recursive method I needed to create another parameter
// to store temporary values.
public void fixedPoint(ArrayList<Integer> list1,
ArrayList<Integer> list2,
ArrayList<Integer> temp)
{
ArrayList<Integer> temp1 = new ArrayList<Integer>();
temp1 = temp;
if (temp1.equals(list2))
{
return;
}
else
{
temp1.clear();
for(int i = 0; i < list2.size(); i++)
// To store temp value of list2,
// I used add method. Because ArrayList is an object type so if I assign
// list2 to temp1 then it will assign memory address rather
// than values. Thus I will lose the values after invoking ascending() as
// all elements of list2 will shipped to list1. So List2 becomes empty.
{
temp1.add(list2.get(i));
}
ascending(list2, list1);
fixedPoint(list2, list1, temp1);
}
}