Java递归简介

article/2025/9/13 16:30:05

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));
}
}

输出:

直接递归输出示例

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中的递归示例

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

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
}
}

输出:

斐波那契数列输出

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

例子#2 –河内塔

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

谜

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

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

以下是可用于解决难题的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);
}
}
}

输出:

河内塔输出

此处,变量“ 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 1-1中的递归

例子#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 1-2中的递归

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 1-3中的递归

Java 1-4中的递归

结论

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

推荐文章

这是Java递归指南。在这里,我们讨论了简介,以及如何在Java中停止无限递归条件,以及不同的示例和代码实现。您也可以查看以下文章以了解更多信息-


http://chatgpt.dhexx.cn/article/WYYbpt1w.shtml

相关文章

Java中的递归详解

文章目录 概述递归累加求和计算1 ~ n的和代码执行图解 递归求阶乘递归打印多级目录综合案例文件搜索 文件过滤器优化Lambda优化 概述 递归&#xff1a;指在当前方法内调用自己的这种现象。递归的分类: 递归分为两种&#xff0c;直接递归和间接递归。直接递归称为方法自身调用自…

fstream的操作

第一段转载自&#xff1a;https://blog.csdn.net/jaster_wisdom/article/details/52400059 在C中输入输出到指定文件&#xff0c;或者从指定文件中读出数据使用fstream类较为方便。 1.将数据写到磁盘的指定文件中 首先第一步是加头文件#include <fstream>,引入库函数 第二…

fstream知识梳理

fstream知识梳理 fstream头文件中的3中类型fstream关联的文件方式读写文件fstream的操作函数eof()函数bad()函数good()函数clear()函数get() 和 put()getline()函数 fstream头文件中的3中类型 ifstream :从一个文件中读取数据ofstream :从一个文件中写入数据fstream :既可以读…

linux fstream open,fstream创建文件的问题

在C语言中&#xff0c;使用FILE*对文件进行操作。当文件不存在时&#xff0c;如果采用w模式打开&#xff0c;文件会自动创建&#xff0c;第二个参数可以为&#xff1a; 如上图所示&#xff0c;只有当以w,w,a,a打开时&#xff0c;文件才会自动创建&#xff0c;而 r,r则不能。 那…

fstream

ifstream -- 从磁盘中写入内存 ofstream -- 从内存中输出到磁盘 #include <fstream> ofstream //文件写操作,内存写入存储设备(文件) 输出流 ifstream //文件读操作,存储设备到内存. 输入流 fstream //读写操作,对打开的文件可进行读写. 前两者的…

fstream读写文件

1.fstream是什么&#xff1f; fstream是C标准库中面向对象库的一个&#xff0c;用于操作流式文件。 fstream本质上是一个class&#xff0c;提供file操作的各种方法。 2.关系图 basic_fstream是一个类模板&#xff0c;暂且不用深入理解它。我们关心的事&#xff0c;它前面继承…

【C++入门】文件流(fstream)介绍和使用

1、打开函数&#xff1a;open mode含义ios::in以读取方式打开文件ios::out以写入方式打开文件ios::binary以二进制方式存取ios::ate存取指针在文件末尾ios::app写入时采用追加方式ios::trunc写入时抹去旧数据 (1)在C11标准时&#xff0c;open函数的文件路径可以传char指针也可以…

谷歌浏览器代理服务器出现问题怎么办?(最快的解决办法)

谷歌浏览器代理服务器出现问题怎么办? 两个解决办法&#xff08;其他浏览器也可用&#xff09;&#xff1a; &#xff08;1&#xff09;方法一&#xff1a;【重置】浏览器。&#xff08;最方便快捷的方式&#xff09; ①进入“设置”——&#xff09;选择“重置并清理”——…

上不了网,代理服务器出现问题

上不了网&#xff0c;代理服务器出现问题 1.问题截图 2.解决的方法

代理服务器可能有问题,或地址不正确的解决方案

可能是设置了代理服务器的原因。 1.先打开代理服务器设置 2.关闭代理服务器。

win10 代理服务器出现问题 或者地址有误

本人win10系统&#xff0c;今天晚上使用浏览器&#xff0c;打开页面的时候突然出现了&#xff1a; 代理服务器出现问题 或者地址有误。 具体诊断&#xff0c;错误截图也就不放了。 解决办法&#xff1a;原本那个使用代理服务器不知道怎么的打开了&#xff0c;关掉之后再通过…

代理服务器可能有问题,或地址不正确(已解决)

解决代理服务器可能有问题&#xff0c;或地址不正确 1. 问题描述2. 解决方法 1. 问题描述 如果遇到电脑连上wifi&#xff0c;其他应用可以上网(例如可以登录QQ)&#xff0c;但是浏览器不能浏览网页&#xff0c;出现代理服务器可能有问题&#xff0c;或地址不正确 这个错误&…

Mac 使用Charles后,退出Charles后,不能浏览网页,提示:未连接到互联网代理服务器出现问题,或者地址有误。

问题&#xff1a; Mac 使用Charles后&#xff0c;退出Charles后&#xff0c;不能浏览网页 提示&#xff1a;未连接到互联网代理服务器出现问题&#xff0c;或者地址有误。 原因&#xff1a; 出现该问题的原因&#xff1a;使用Charles时&#xff0c;会自动打开网络代理。正常…

代理服务器有问题怎么办?

问题&#xff1a;代理服务器可能有问题&#xff0c;或vkeeper链接无网络&#xff08;vkeeper两步都要做&#xff09; 解决方法&#xff1a; 第一步&#xff1a;在下方搜索栏搜索更改代理设置并点击&#xff1b;或其他方式进入代理服务器设置 进入后&#xff0c;观察 手动设置代…

chrome 未连接到互联网 代理服务器出现问题,或者地址有误

一天两头的连不上网&#xff0c;原因是莫名其妙的被加上了代理&#xff0c;解决方案如下&#xff1a; 请检查您的代理服务器设置或与网络管理员联系&#xff0c;以确保代理服务器正常运行。如果您认为自己不需要使用代理服务器&#xff0c;请执行以下操作&#xff1a; 依次转到…

未连接到互联网 代理服务器出现问题,或者地址有误。

请检查您的代理服务器设置或与网络管理员联系&#xff0c;以确保代理服务器正常运行。如果您认为自己不需要使用代理服务器&#xff0c;请执行以下操作&#xff1a; 依次转到 Chrome 菜单 >“设置”>“显示高级设置…”>“更改代理服务器设置…”>“LAN 设置”&…

网页未连接到互联网,代理服务器出现问题

网页未连接到互联网&#xff0c;代理服务器出现问题 如果网络正常连接但是网页却打不开&#xff0c;&#xff08;qq微信都可以登录&#xff09;网页出现以下页面&#xff1a; 解决办法&#xff1a; windows搜索代理服务器&#xff0c;或者打开设置-网络和Internet-代理。关闭使…

浏览器代理服务器出现问题

使员工charles时&#xff0c;会出现&#xff0c;可以启动charles&#xff0c;解决问题&#xff0c;或者关闭代理 一直使用正常&#xff0c;浏览器突然不能访问&#xff0c;显示如下 搜狗浏览器&#xff1a; 到搜狗浏览器&#xff0c;设置--高级 不使用代理 解决问题 chrome浏览…

问题:未连接到互联网 代理服务器出现问题,或者地址有误。

出现的问题如下图&#xff1a; 解决方案如下&#xff1a; (此问题有俩种解决方法&#xff0c;我个人推荐使用第二种方案&#xff0c;能够最快最好最实用地去解决此问题;) 法一&#xff1a;燃眉之急的方法(但不能完全解决问题)&#xff1a; 步骤1&#xff1a;按 WinR 键&…

Chrome代理服务器出现问题,或者地址有误(win10)

chrome浏览器输入任何网址都显示如下界面 这种情况&#xff0c;原因有很多&#xff0c;总之网络连接有问题&#xff1a; 解决&#xff1a; 1、查看网络连接&#xff0c;确认只有chrome不好使&#xff0c;其他软件联网正常 2、是否使用了“梯子”之类的东西&#xff0c;如果有&…