Java递归算法

程序调用自身的编程技巧称为递归(recursion),它做为一种算法在程序设计语言中广泛应用。Java支持递归,在 Java 编程中,递归是允许方法调用自身调用的属性。调用自身的方法称为是递归的。

一个物理世界的实例是放置两个彼此面对的平行反射镜。它们之间的任何对象都将被递归地反射。

递归如何工作?

一个函数正在调用自己

Java递归的工作流程图

在上面的示例中,我们从main方法内部调用了recurse()方法。  

在recurse()方法内部,我们再次调用相同的recurse方法。 这是一个递归调用。

为了停止递归调用,我们需要在方法内部提供一些条件。否则,该方法将被无限调用。

因此,我们使用if...else..或类似方法)终止方法内部的递归调用。

示例:使用递归的阶乘

class Factorial {

    static int factorial( int n ) {
        if (n != 0)  // 终止条件
            return n * factorial(n-1); //递归调用
        else
            return 1;
    }

    public static void main(String[] args) {
        int number = 4, result;
        result = factorial(number);
        System.out.println(number + " 的阶乘= " + result);
    }
}

输出

4 的阶乘= 24

在上面的示例中,我们有一个名为factorial()的方法。 从main()方法调用factorial()。 用传递的数字变量作为参数。

在这里,请注意以下语句:

return n * factorial(n-1);

factorial()方法正在调用自身。 最初,n的值在factorial()内部为4。 在下一个递归调用期间,将3传递给factorial()方法。 此过程一直持续到n等于0。

当n等于0时,if语句返回false,因此返回1。最后,将累积的结果传递给main()方法。

阶乘程序的工作流程

下图将使您更好地了解如何使用递归执行阶乘程序。

使用递归查找数字的阶乘

使用递归的阶乘程序

递归的优缺点

进行递归调用时,将在堆栈上分配新的变量存储位置。随着每个递归调用的返回,旧的变量和参数将从堆栈中删除。因此,递归通常使用更多的内存,并且通常很慢。

另一方面,递归解决方案要简单得多,并且花费更少的时间来编写,调试和维护。

java中方法如何递归调用

方法递归是指在方法中调用自身的过程。

在Java中,可以通过以下步骤实现方法递归调用:

  • 定义一个方法,并确保该方法可以接受参数。
  • 在方法内部使用条件语句(if/else)或循环语句(while/for)来控制方法是否继续递归调用自身。
  • 在条件语句或循环语句内部,调用该方法并传入新的参数。这样,方法就会重新执行,并且可能再次递归调用自身。
  • 当条件不再满足时,递归过程就会停止,并将结果返回给调用者。

以下是一个简单的例子,展示了如何使用递归来计算阶乘:

public class RecursionExample {
    public static int factorial(int n) {
        if (n == 1) //递归终止条件
            return 1;
        else
            return n * factorial(n-1); //递归调用
    }

    public static void main(String[] args) {
        int num = 5;
        int result = factorial(num);
        System.out.println("Factorial of " + num + " is " + result);
    }
}

在上面的示例中,factorial方法使用递归计算给定数字的阶乘。当n等于1时,递归终止。否则,它会调用自身并将n-1作为参数传递。在每个递归调用中,n的值都会减少,直到递归终止。最终,将计算出阶乘的值,并将其返回给调用者。

案例:使用递归调用打印十进制整数对应的二进制码

以下是JAVA代码实现:

public class DecimalToBinary {
   public static void main(String[] args) {
      int decimal = 15;
      System.out.print("二进制数为:");
      decimalToBinary(decimal);
   }

   public static void decimalToBinary(int decimal) {
      if (decimal > 0) {
         decimalToBinary(decimal / 2);
         System.out.print(decimal % 2);
      }
   }
}

输出结果为:

二进制数为:1111

说明:

  • 该代码分为两部分:主函数和递归函数。
  • 主函数中定义了一个十进制整数变量 decimal,并调用了递归函数 decimalToBinary(),并将 decimal 作为参数传递给该函数。
  • 递归函数 decimalToBinary() 实现了将十进制整数转换成二进制数的功能。
  • 递归函数中如果传入的十进制整数大于 0,则递归调用自身并将传入参数除以 2,以实现对二进制数的分解。
  • 最后在每次递归调用结束时,输出 传入参数对 2 取余数的结果,以实现对二进制数的生成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值