将for循环更改为递归函数

时间:2016-03-22 20:05:27

标签: java for-loop recursion

所以我读过你可以将任何循环转换为递归函数,我想知道如何将下面的代码(打印出字符串的排列)变成一个(用以下代码替换for循环)递归函数)。我不是在寻求解决方案,而是在思考如何处理这样的任务。谢谢!

private static void permutation(String prefix, String str) {

 int n = str.length();

  if (n == 0) System.out.println(prefix);

  else {

    for (int i = 0; i < n; i++)
       permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1, n));
  }
}

谢谢大家!

2 个答案:

答案 0 :(得分:1)

如果你不想改变合约,你可以通过帮助来实现。

private static void permutationFor(int i, int n, String prefix, String str) {
    if( i < n ) {
        permutation(prefix + str.charAt(i), 
                    str.substring(0, i) + str.substring(i+1, n));
        permutationFor(i+1, n, prefix, str);
    }
}

因此,您通过调用permututaionFor

更改for循环
private static void permutation(String prefix, String str) {
    int n = str.length();
    if (n == 0) {
        System.out.println(prefix);
    } else {
        premutationFor(0, n, prefix, str);
    }
}

答案 1 :(得分:0)

添加参数以表示下限和上限

private static void permutation(String prefix, String str, int i, int j) {

在排列开始时添加边界条件,

if(i < j){

然后省略for循环,并在你已经递归的排列调用中,

permutation(..., i+1, j);

最后,当你最初从其他代码调用它时,传递0并将参数str的长度()作为i和j的值。

你还可以创建另一个置换(...)重载,它带有两个额外的参数,所以你的初始调用不必解决它们。

请注意,您可以删除代码中n周围的部分冗余,但是可以在不执行此操作的情况下解决此问题。