Удалите счетчик stati c int из этого рекурсивного решения - PullRequest
0 голосов
/ 05 августа 2020

У меня есть этот рекурсивный код для подсчета количества перестановок, которые может иметь строка

public class Permutation {

static int counter = 0;

public static int perms(String s, int level,int length) {

    if(level == length-1) {
        counter++;
    }
    else {
        for (int i = 0; i < s.length(); i++) {
            String newString = s.substring(0, i) + s.substring(i + 1);
            perms(newString,level + 1, length);
        }
    }
    return counter;

}

public static void main(String[] args) {

    System.out.println(perms("plot", 0, 4));

}

}

Мне было интересно, как я могу его переписать, чтобы он не использовал static int counter = 0? Спасибо!

ПРИМЕЧАНИЕ: Да, я знаю, что могу просто использовать формулу перестановки для этого хаха

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Без необходимости использования статического c счетчика или передачи значения счетчика при каждом вызове метода. Обратите внимание, что ваша реализация учитывает все перестановки, а не уникальные перестановки (строка «aab» возвращает 6, а не 3).

public static int permsRedone(String s, int level,int length){
  int count = 0;

  if(level == length-1){
    return 1;
  }
  else {
    for (int i = 0; i < s.length(); i++) {
      String newString = s.substring(0,i)+s.substring(i+1);
      count += permsRedone(newString,level+1,length);
    }
  }
  return count;

}
1 голос
/ 05 августа 2020

Вы можете передать счетчик в качестве четвертого аргумента (используя 0 в качестве начального значения). Верните его из perms и установите значение, возвращаемое из внутреннего вызова.

public static int perms2(String s, int level,int length, int count){
        if(level == length-1){
            count++;
        }
        else {
            for (int i = 0; i < s.length(); i++) {
                String newString = s.substring(0,i)+s.substring(i+1);
                count = perms2(newString,level+1,length, count);
            }
        }
        return count;
    }
...