алгоритм перестановки в Java - PullRequest
0 голосов
/ 20 ноября 2018

Я пытался переставить, используя Java, и я заметил, что мой код работает для строк, но тот же алгоритм не работает правильно для массивов

вот код для строк

public static void Recurse(String s,int i)
{
    for(int j=i;j<(s.length());j++)
    {   
        s=Swap(s,i,j);
     if(i<(s.length()-1))
     {  
        Recurse(s,i+1); 
     }
        if(i==(s.length()-1))
        {   
            Display(s);        
        }
    }       
}   
   public static String Swap(String newString,int i,int j)
{
    char  newChar[]=newString.toCharArray();
    char temp=newChar[i];
    newChar[i]=newChar[j];
    newChar[j]=temp;

    return String.valueOf(newChar);
}

    public static void Display(String s)
    {
        System.out.println(s);
    }

public static void main(String args[])
{
    String i=new String("123");
    Recurse(i,0);
 }

output:123 132 213 231 312 321 работает нормально.

тогда вот код для массивов

public static void Recurse(int [] newArray,int i)
{ 
    for(int j=i;j<newArray.length;j++)
    {
    Swap(newArray,i,j);
    if(i<(newArray.length-1))
    {
        Recurse(newArray,i+1);
    }   
    if(i==(newArray.length-1))
    {
        Display(newArray);
    }   

    }   

}

public static void Display(int [] Array)
{
    for(int i: Array)
    {
        System.out.print(i);
    }
    System.out.println();
}


public static void main(String args[])
{
    Recurse(new int[] {1,2,3},0);
}

output 123 132 312 321 123 132

Не работает правильно, поэтомумне было интересно, что здесь пошло не так.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Строки являются неизменяемыми, поэтому, когда Recurse(String s,int i) вызывает Recurse(s,i+1);, значение s остается неизменным.

Массивы являются изменяемыми, поэтому, когда Recurse(int [] newArray,int i) вызывает Recurse(newArray,i+1);, значение newArray изменено.

Вот почему они ведут себя по-разному.

Примечание: Когда я говорю «значение», я имею в виду значениеобъекта, а не значение самой ссылочной переменной.

0 голосов
/ 20 ноября 2018

Вывод выглядит корректно с кодом ниже:

public static void recurse(int[] newArray, int i) {
    for (int j = i; j < newArray.length; j++) {
        newArray = swap(newArray, i, j);
        if (i < (newArray.length - 1)) {
            recurse(newArray, i + 1);
        }
        if (i == (newArray.length - 1)) {
            display(newArray);
        }
    }
}

private static int[] swap(int[] a, int i, int j) {
    int[] newArray = a.clone();
    int temp = newArray[i];
    newArray[i] = newArray[j];
    newArray[j] = temp;
    return newArray;
}

public static void display(int[] Array) {
    for (int i : Array) {
        System.out.print(i);
    }
    System.out.println();
}


public static void main(String args[]) {
    recurse(new int[]{1, 2, 3}, 0);
}

вывод: 123 132 213 231 312 321

Я только что внес несколько изменений в swap код метода,Я сделал его похожим на тот, который вы использовали в методе Strings swap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...