## 没有退出条件的递归代码示例

``````public class Fibonacci {
public static void main(String[] args) {
System.out.println(0);
System.out.println(1);
printFibonacci(0, 1);
}

private static void printFibonacci(long penultimate, long previous) {
long current = penultimate + previous;
System.out.println(current);
printFibonacci(previous, current);
}
}``````

## 具有退出条件的更正示例

``````public class Fibonacci {
public static void main(String[] args) {
System.out.println(0);
System.out.println(1);
//        printFibonacci(0, 1);
printFibonacciWithCondition(0, 1);
}

private static void printFibonacci(long penultimate, long previous) {
long current = penultimate + previous;
System.out.println(current);
printFibonacci(previous, current);
}

private static void printFibonacciWithCondition(long penultimate, long previous) {
long current = penultimate + previous;
if (current > Integer.MAX_VALUE) {
return;
}
System.out.println(current);
printFibonacciWithCondition(previous, current);
}
}``````

## 递归下降和展开

``````public class Fibonacci {
public static void main(String[] args) {
System.out.println(0);
System.out.println(1);
printFibonacciWithCondition(0, 1);
}

private static void printFibonacciWithCondition(long penultimate, long previous) {
long current = penultimate + previous;
if (current > Integer.MAX_VALUE) {
return;
}
echo(true, penultimate, previous);
System.out.println(current);
printFibonacciWithCondition(previous, current);
echo(false, penultimate, previous);
}

private static void echo(boolean isBeforeRecursiveCall, long penultimate, long previous) {
if (isBeforeRecursiveCall) {
System.out.printf("Before method call with args: %d, %d. Current number = ", penultimate, previous);
} else {
System.out.printf("After method call with args: %d, %d\n", penultimate, previous);
}
}
}``````

0
1

args 进行方法调用之前：1、1。当前编号 = 2

args 进行方法调用之前：5、8。当前编号 = 13

args 进行方法调用之前：21、34。当前编号 = 55

args 进行方法调用之前：987、1597。当前编号 = 2584

args 进行方法调用之前：46368、75025。当前编号 = 121393 在使用 args 进行

args 进行方法调用之前：832040、1346269。当前编号 = 2178309 在使用
args 进行方法调用之前：1346269、2178309。当前编号 = 3524578

, 63245986. 当前号码 = 102334155

= 1134903170 在使用参数调用方法之前
：701408733， 1134903170。当前号码 = 1836311903

: 165580141, 267914296

317811 之后带参数的方法调用：121393、196418 带参数的方法调用之后：75025、121393 带参数的方法调用之后：46368、75025

args 的方法调用之后：10946、17711 在使用
args 的方法调用之后：6765、10946 在使用 args 的

``````public class Fibonacci {
public static void main(String[] args) {
printFibonacciWithCondition(0, 1);
System.out.println(1);
System.out.println(0);
}

private static void printFibonacciWithCondition(long penultimate, long previous) {
long current = penultimate + previous;
if (current > Integer.MAX_VALUE) {
return;
}
printFibonacciWithCondition(previous, current);
System.out.println(current);
}
}``````

1836311903
1134903170
701408733
433494437
267914296
165580141
102334155
63245986
39088169
24157817
14930352
9227465
5702887
3524578
2178309
1346269
832040
514229
317811
196418
121393
75025
46368
28657
17711
10946
6765
4181
2584
1597
987
610
377
233
144
89
55
34
21
13
8
5
3
2
1
1
0