# Java 递归指南

> 原文： [https://howtodoinjava.com/java/basics/java-recursion/](https://howtodoinjava.com/java/basics/java-recursion/)

**递归**是一种编程样式，其中**方法重复调用其自身**，直到满足某个预定条件为止。 这种方法调用也称为**递归方法**。

## 1\. 递归方法的语法

基于递归的方法必须具有两个基本组成部分才能正确解决问题。

1.  递归方法调用
2.  打破递归的前提

请记住，如果无法达到或未定义前提条件，则会发生栈溢出问题。

```java
method(T parameters...) 
{
    if(precondition == true)      //precondition
    {
        return result;
    }

    return method(T parameters...);      //recursive call
}

```

## 2\. 递归类型

根据何时进行递归方法调用，递归有两种类型。

#### 1\. 尾递归

当递归方法调用是该方法内部执行的最后一条语句时（通常与`return`语句一起使用），则递归方法为**尾递归**。

```java
method(T parameters...) 
{
    if(precondition == true)      
    {
        return result;
    }

    return method(T parameters...);     
}

```

#### 2\. 头递归

不是尾递归的任何递归都可以称为头递归。

```java
method(T parameters...) 
{
    if(some condition)      
    {
        return method(T parameters...);
    }

    return result;     
}

```

## 3\. Java 递归示例

#### 3.1 斐波那契序列

斐波那契数列是一个数字序列，其中每个数字都定义为两个数字之和。

例如 -1、1、2、3、5、8、13、21、34，依此类推…

此函数为我们提供从 1 开始的第 n 个位置的斐波那契数。

```java
public int fibonacci(int n) 
{
    if (n <= 1) {
        return n;
    }
    return fibonacci(n-1) + fibonacci(n-2);
}

```

让我们测试一下此函数以打印`n = 10`的斐波那契数列；

```java
public static void main(String[] args) 
{
  int number = 10;

  for (int i = 1; i <= number; i++) 
  {
    System.out.print(fibonacci(i) + " ");
  }

}

```

程序输出。

```java
1 1 2 3 5 8 13 21 34 55 

```

#### 3.2 最大公约数

两个正整数的*最大公约数*（gcd）是最大的整数，该整数平均分为两个整数。

```java
public static int gcd(int p, int q) {
    if (q == 0) return p;
    else return gcd(q, p % q);
}

```

让我们测试一下此函数以打印`n = 10`的斐波那契数列：

```java
public static void main(String[] args) 
{
  int number1 = 40;
  int number2 = 500;

  System.out.print( gcd(number1, number2) );
}

```

程序输出：

```java
20

```

让我知道您有关 Java 中**递归的问题**。

学习愉快！