为什么没有调用所有案例的递归代码?

时间:2015-08-19 04:00:11

标签: java recursion

我目前是一名学习递归的新手程序员,我不明白为什么我的代码不起作用。我必须编写一个名为waysToClimb的递归方法,它输出不同的方法来爬n步。你可以在1步中爬1步或2步。以下是我到目前为止的情况:

public void waysToClimb(int n) {
  if (n == 0) {
    //base case, makes a new line for the next series of steps 
    System.out.println();
  }
  if (n >= 1) {
    //1 step, prints 1 and subtracts 1 from n
    System.out.print("1 ");
    waysToClimb(n - 1);
  }
  if (n >= 2) {
    //2 steps, prints 2 and subtracts 2 from n
    System.out.print("2 ");
    waysToClimb(n - 2);
  }
}

我的问题是,当步数大于2时,n >= 2的if语句只输出2,但没有其他数字。例如,情况wayToClimb(3)打印出来:

1 1 1  
2 (should be 1 2)  
2 1  

为什么不打印1 2?我不打算将所有可能的组合打印出来的if语句,因为代码被强制检查每一个

2 个答案:

答案 0 :(得分:2)

标记代码并单步执行:

public void waysToClimb(int n) {
  // #1
  if (n == 0) {   
    //base case, makes a new line for the next series of steps 
    System.out.println();
  }
  // #2
  if (n >= 1) {
    //1 step, prints 1 and subtracts 1 from n
    System.out.print("1 ");
    waysToClimb(n - 1);
  }
  // #3
  if (n >= 2) {
    //2 steps, prints 2 and subtracts 2 from n
    System.out.print("2 ");
    waysToClimb(n - 2);
  }
}

您的代码现在循序渐进:

Call:          IF:    Print:      Function call:
waysToClimb(3) #2     1           waysToClimb(2)
waysToClimb(2) #2     1           waysToClimb(1)
waysToClimb(1) #2     1           waysToClimb(0)
waysToClimb(0) #1     \n          return
waysToClimb(2) #3     2           waysToClimb(0)
waysToClimb(0) #1     \n          return
waysToClimb(3) #3     2           waysToClimb(1)
waysToClimb(1) #2     1           waysToClimb(0)
waysToClimb(0) #1     \n          return

因此输出为:

1 1 1
2
2 1

你应该做什么:

public void waysToClimb(int n, String s) {
  if (n == 0) {
    System.out.println(s);
  }
  if (n >= 1) {
    waysToClimb(n - 1, s + "1 ");
  }
  if (n >= 2) {
    waysToClimb(n - 2, s + "2 ");
  }
}    

使用以下方法调用该函数:

 waysToClimb(3, "");

答案 1 :(得分:0)

调用堆栈是:

waysToClimb(3)
  System.out.print("1 ")
  waysToClimb(2)
    System.out.print("1 ")
    waysToClimb(1)
      System.out.print("1 ")
      waysToClimb(0)
        System.out.println()
    System.out.print("2 ")
    waysToClimb(0)
      System.out.println()
  System.out.print("2 ")
  waysToClimb(1)
    System.out.print("1 ")
    waysToClimb(0)
      System.out.println()