Java递归简介

Java中的递归定义为“方法直接或间接调用自身(相同方法)”。递归函数用于需要一次又一次地执行同一组操作直到达到结果的情况。它执行几次迭代,并且每次迭代问题说明都变得越来越简单。Java中的递归是一种基于对同一问题的较小块的解决方案来解决问题的方法。大部分无限可能性迭代都可以通过递归来解决。我们可以说递归是循环语句的另一种方法。如果我们没有正确使用递归函数,那么它将执行无限次。

句法:

returntype methodName() { //logic for application methodName();//recursive call }

如何在Java中停止无限递归条件?

要停止无限条件,我们必须具有以下条件:

  • 基本条件:在内部指定条件是否停止递归功能。
  • 递归调用: 正确的递归调用。

我们可以通过两种方式调用递归函数:

1.直接递归调用

如果从内部方法主体中调用相同的方法。

句法:

returntype methodName()
 {
 //logic for application
 methodName();//recursive call
 }

例子:

数字的阶乘是直接递归的一个示例。递归的基本原理是通过分解成较小的问题来解决一个复杂的问题。例如,在数量阶乘的情况下,如果我们知道阶乘“ i-1”,我们就可以计算出阶乘“ i”。

代码:

public class Factorial {
 static int fact(int i){
 if (i == 1)
 return 1;
 else
 return(i * fact(i-1));
 }
 public static void main(String[] args) {
 System.out.println("The factorial of given number 6 is: "+fact(6));
 }
 }

输出:

java递归返回值不对 java递归函数详解_java递归返回值不对

2.间接/相互递归调用

如果我们从另一个方法调用一个方法,而从第一个方法调用另一个方法,反之亦然。


句法:

firstIndirectRecursive()
 {
 // Logic
 secondIndirectRecursive();
 }
 secondIndirectRecursive()
 {
 //Logic
 firstIndirectRecursive();
 }

例子:

为了显示间接递归,我们使用以下程序来查找给定输入中给定数字是偶数还是奇数。

代码:

import java.util.Scanner;
 public class IndirectRecursion {
 public static boolean oddNum(int i) {
 if (i<0) throw new IllegalArgumentException("Number is negative");
 if(i == 0){
 return false;
 } else {
 return evenNum(i-1);
 }
 }
 public static boolean evenNum(int i) {
 if (i<0) throw new IllegalArgumentException("Number is negative");
 if(i == 0){
 return true;
 } else {
 return oddNum(i-1);
 }
 }
 public static void main(String[] args) {
 Scanner inputNum = new Scanner(System.in);
 System.out.print("Give a number: ");
 int n = inputNum.nextInt();
 if (evenNum(n)) System.out.println(n + " is even");
 else System.out.println(n + " is odd");
 inputNum.close();
 }
 }

输出:

java递归返回值不对 java递归函数详解_递归_02

Java中的递归示例

以下是一些使用递归方法解决问题的示例。

Example#1 –斐波那契数列

如果number3 = number1 + number2,即每个数字是其前两个数字的和,则称一组“ n”个数字位于斐波纳契数列中。因此,序列始终以前两个数字(例如0和1)开头。第三个数字是0和1的总和,结果为1,第四个数字是1和1的加法结果,结果为2,该序列继续进行。

在Java中签出以下代码以生成斐波那契序列:

代码:

public class FibonacciSeries{
 static int num1=0,num2=1,num3=0;
 static void fibonacci(int n){
 if(n>0){
 num3 = num1 + num2;
 num1 = num2;
 num2 = num3;
 System.out.print(" "+num3);
 fibonacci(n-1);
 }
 }
 public static void main(String args[]){
 int n=10;
 System.out.print(num1+" "+num2);//printing constant first two digits 0 and 1
 fibonacci(n-2);//Since first two numbers are already done
 }
 }

输出:

java递归返回值不对 java递归函数详解_System_03

在这里,前两个数字被初始化为0和1并打印。变量“ num1”,“ num2”和“ num3”用于生成所需的序列。变量“ num3”是通过将“ num1”和“ num2”相加而得到的,数字通过改组向左移动一个位置,如代码所示。函数“ Fibonacci”在此处被递归调用,并且在每次迭代时,“ n”的值都会减少1。因此,一旦“ n”达到值0,递归就会退出。

例子#2 –河内塔

这是一个经典的数学问题,具有3个极点和n个数量不同大小的磁盘。难题如下:

java递归返回值不对 java递归函数详解_Java_04

首先,第一个磁极将具有这样排列的磁盘,使得它们中最大的磁盘都位于磁极的底部,最小的磁盘位于磁极的顶部。目的是将这些磁盘从第一磁极移动到第三磁极,以使磁盘保持与第一磁极相同的位置。在移动这些磁盘时,请牢记以下几个条件:

  • 一次只需要移动一个磁盘。
  • 在此过程中,不允许将较大的磁盘放在较小的磁盘上。
  • 在将光盘从第一极转移到第二极时,第二(中间)极可用于介导。

以下是可用于解决难题的Java代码:

代码:

public class TowerOfHanoi {
 public static void main(String[] args) {
 int count = 3;
 tower(count, 'A', 'B', 'C');
 }
 public static void tower(int first, char disk1, char temp, char disk2) {
 if (first == 1) {
 System.out.println("Disk 1 from " + disk1 + " to " + disk2);
 } else {
 tower(first - 1, disk1, disk2, temp);
 System.out.println("Disk " + first + " from " + disk1 + " to " + disk2);
 tower(first - 1, temp, disk1, disk2);
 }
 }
 }

输出:

java递归返回值不对 java递归函数详解_递归_05

此处,变量“ count”代表要使用的光盘数量。“塔式”功能是用于将圆盘从杆1移至杆3的递归功能。可以通过首先考虑2个圆盘来提供此问题的简单解决方案。

  • 首先,我们先将圆盘1从杆1移到杆2。
  • 接下来,我们将disc2移至杆3。
  • 最后,我们通过将圆盘1移至杆3来完成所需的解决方案。

通过将光盘从杆1移至(n-1)并遵循上述类似步骤,将相同的原理应用于“ n”个光盘。

例子#3 –阶乘

代码:

package com.recursion;
 import java.util.Scanner;
 public class FactorialOfNumber {
 public static void main(String[] args) {
 Scanner scanner = new Scanner(System.in);
 System.out.println("Which number factorial do you want?=>");
 //taking input from the user
 int input = scanner.nextInt();
 System.out.println("Factorial of " + input + "! is=>"+getMyFactorialNumber(input));
 scanner.close();
 }
 public static long getMyFactorialNumber(int inputNumber) {
 if (inputNumber == 1)//base condition
 return 1;
 return inputNumber * getMyFactorialNumber(inputNumber - 1);//recursive call
 }
 }

输出:

java递归返回值不对 java递归函数详解_Java_06

例子#4 –阿姆斯特朗号

代码:

import java.util.Scanner;
 //ARMSTRONG number means sum of numbers of cubes equal to the number
 public class ArmstrongNumber {
 public static void main(String[] args) {
 Scanner scanner = new Scanner(System.in);
 System.out.println("Enter any Number?=>");
 // taking input from the user
 int input = scanner.nextInt();
 //calling isArmstrongNumber() method and put in a variable
 double checkNumber=isArmstrongNumber(input);
 //checking the number
 if(input==checkNumber)
 {
 System.out.println(input+" is ARMSTRONG NUMBER");
 }
 else
 {
 System.out.println(input+" not is ARMSTRONG NUMBER");
 }
 scanner.close();
 }
 static int remainderNumber;
 static double total = 0;
 public static double isArmstrongNumber(int inputNumber) {
 if (inputNumber > 0) {
 remainderNumber = inputNumber % 10;//separating digits
 total = total + Math.pow(remainderNumber, 3);//cubes sum
 isArmstrongNumber(inputNumber / 10);//recursive call
 }
 return total;
 }
 }

输出:

java递归返回值不对 java递归函数详解_System_07

Example#5 –回文数

代码:

import java.util.Scanner;
 public class PalindromeNumber {
 public static void main(String[] args) {
 Scanner scanner = new Scanner(System.in);
 System.out.println("Enter any Number=>");
 // taking input from the user
 int input = scanner.nextInt();
 int checkNumber = palindromeNumberOrNot(input,0);
 if (checkNumber == input)
 {
 System.out.println(input+" is a PALINDROME NUMBER");
 }
 else
 {
 System.out.println(input+" is not a PALINDROME NUMBER");
 }
 scanner.close();
 }
 public static int palindromeNumberOrNot(int inputNumber,int baseNumber) {
 if (inputNumber == 0)// base case
 return baseNumber;
 baseNumber = (baseNumber * 10) + (inputNumber % 10);// getting the reverse of the number and stores in temp
 return palindromeNumberOrNot(inputNumber/10,baseNumber);//recursive call
 }
 }

输出:

java递归返回值不对 java递归函数详解_java递归返回值不对_08

java递归返回值不对 java递归函数详解_java递归返回值不对_09

结论

递归函数相对来说比较简单,但是与其他现有方法相比,它们的效率也不高。因此,它们主要用于以下情况:开发时间短,并且在问题中可以观察到明显的模式。

推荐文章

这是Java递归指南。在这里,我们讨论了简介,以及如何在Java中停止无限递归条件,以及不同的示例和代码实现。