为什么此递归代码重复无限?

时间:2019-07-09 02:27:04

标签: java recursion

我只是使用递归代码进行计算,但是它会陷入无限循环。

编辑:完整代码。 而且IDE(Eclipse)对此一无所获,并且可以很好地运行。

class RepresentWithN {
    static int number;
    static int N;
    static int answer;

public int solution(int N, int number) {
    RepresentWithN.N = N;
    RepresentWithN.number = number;
    answer = 9;

    calc(0, 0);
    return answer == 9 ? -1 : answer;
}

static int conN(int length) {
    int tmp = N;
    for (int i = 1; i < length; i++) {
        tmp += tmp * 10;
    }
    return tmp;
}

static void calc(int prev, int count) {
    if (count == 9) {
        return;
    }

    if (prev == number) {
        answer = Math.min(answer, count);
        return;
    }
    System.out.println("count=" + count + " prev=" + prev);
    for (int i = 1; i <= 5; i++) {
        calc(prev + conN(i), count + 1);
        calc(prev - conN(i), count + 1);
        calc(prev * conN(i), count + 1);
        calc(prev / conN(i), count + 1);
    }
}

重复的“计数”大约是7或8,不知道为什么。

2 个答案:

答案 0 :(得分:1)

最终count的值为9。通过打印此值进行检查。

static void calc(int prev, int count) {
        System.out.println("count=" + count + " prev=" + prev);
        if (count == 9) {
            return;
        }
        ...

您的递归中有很多分支,需要大量的计算。那就是为什么它没有结束。您可以再等一个小时或几天/年才能看到该程序的结束。或以高效的代码替换此代码。

答案 1 :(得分:0)

尝试一下。每次运行后,请取消注释其中一个递归调用。


public class ForEverDemo {

   static long count = 0;

   public static void main(String[] args) {
      alongtime(0);
      System.out.println("count = " + count);
   }

   public static void alongtime(int v) {
      count++;
      if (v == 9) {
         return;
      }
      for (int i = 0; i < 3; i++) {
         alongtime(v + 1);
         // alongtime(v + 1);
         // alongtime(v + 1);
         // alongtime(v + 1);
         // alongtime(v + 1);
      }
   }
}