递归和迭代在空间利用率方面有所不同。迭代是逐渐逼近问题,用新值覆盖旧值,直到满足条件后结束,不保存中间值,因此空间利用率较高。而递归是将一个问题分解为若干相对小一点的问题,遇到递归出口再原路返回,因此必须保存相关的中间值,这些中间值压入栈保存,问题规模较大时会占用大量内存。
利用递归可以解决很多问题,例如背包问题、汉诺塔问题和斐波那契数列等。下面用一个简单的斐波那契数列来演示递归:
```java
package cn.edu.ahui;
import java.util.Scanner;
public class Fibonacci {
int result;
public int fibo(int n) {
if (n != 1 && n != 2) {
// 递归
result = fibo(n - 1) + fibo(n - 2);
return result;
} else {
return 1;
}
}
public static void main(String[] args) {
Fibonacci fibonacci = new Fibonacci();
System.out.print("请输入一个整数n:");
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int a = fibonacci.fibo(n);
System.out.println(a);
}
}
```
迭代经典例子就是实数的累加,比如计算1-100所有实数的和。以下是迭代实现的代码:
```java
int v = 1;
for (int i = 2; i <= 100; i++) {
v = v + i;
}
```
两者之间的关系如下:
1) 递归中一定有迭代,但是迭代中不一定有递归,大部分可以相互转换。
2) 能用迭代的不用递归,递归调用函数,计算有重复,浪费空间,并且递归太深容易造成堆栈的溢出。