递归和迭代在空间利用率方面有所不同。迭代是逐渐逼近问题,用新值覆盖旧值,直到满足条件后结束,不保存中间值,因此空间利用率较高。而递归是将一个问题分解为若干相对小一点的问题,遇到递归出口再原路返回,因此必须保存相关的中间值,这些中间值压入栈保存,问题规模较大时会占用大量内存。

利用递归可以解决很多问题,例如背包问题、汉诺塔问题和斐波那契数列等。下面用一个简单的斐波那契数列来演示递归:

```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) 能用迭代的不用递归,递归调用函数,计算有重复,浪费空间,并且递归太深容易造成堆栈的溢出。