【Java】C语言里叫【函数】,Java里叫【方法】——一文讲清楚Java里的“函数“——方法(三)

简介: 前言咱们在C语言里肯定都学过函数吧,相信大家对函数的理解已经很深刻了,因为函数在C里用的会很多,特别是做项目的时候,会分模块来写,Java里同样为大家提供了“函数”,只不过叫法不一样,Java里叫【方法】,接下来请往下看

🌙递归练习

代码示例1

按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)

public static void print(int num) {
   if (num > 9) {
       print(num / 10);
  }
   System.out.println(num % 10);
}

代码示例2
递归求 1 + 2 + 3 + … + 10

public static int sum(int num) { 
if (num == 1) { 
return 1; 
} 
return num + sum(num - 1); 
}

代码示例3
写一个递归方法,输入一个非负整数,返回组成它的数字之和. 例如,输入 1729, 则应该返回

1+7+2+9,它的和是19

public static int sum(int num) { 
if (num < 10) { 
return num; 
} 
return num % 10 + sum(num / 10); 
}

代码示例4敲重点!!敲重点!!敲重点!!

求斐波那契数列的第n项斐波那契数列是一组第一位和第二位为1,从第三位开始,后一位是前两位和的一组递增数列,像这样的:0、1、1、2、3、5、8、13、21、34、55…

方法一:循环

这种解法是比较高效的一种解法
时间复杂度O(n),空间复杂度O(1)


import java.util.Scanner;
public class 斐波那契数 {//时间复杂度O(n),空间复杂度O(1)
   public static void main(String[] args) {
       Scanner scn = new Scanner(System.in);
       int n = scn.nextInt();
       int a = 0;
       int b = 1;
       int tmp = 0;
       if (n==1){
           System.out.println(0);
       }
       else if (n==2){
           System.out.println(1);
       }
       else if (n>2) {
           for ( int i = 3; i <= n; i++ ) {
               tmp = a+b;
               a = b;
               b = tmp;
           }
           System.out.println(b);
       }
   }
}

方法二:递归

此解法思维方式非常简单
但是时间复杂度特别高,时间复杂度O(2^n),空间复杂度O(n)
不建议采用这种方法。

import java.util.Scanner;
public class 递归求斐波那契数列 {//时间复杂度O(2^N),空间复杂度O(n)
    public static int count = 0;
    public static int Fib(int n) {
        if (n==1)
           return 0;
        else if (n==2||n==3)
          return 1;
       else if (n==4)
          count++;
        return Fib(n-1)+Fib(n-2);
    }
   public static void main(String[] args) {
       Scanner scn = new Scanner(System.in);
       while (scn.hasNextInt()) {
           int n = scn.nextInt();
           System.out.println("第"+n+"个斐波那契数是"+Fib(n));
           System.out.println("递归了"+count+"次");
           count = 0;
       }
   }
}

可以看到当求第40个斐波那契数时,重复次数高达24157817次

c9570745fb70469693f35ab0df45f30c.png

方法三:高效递归

如果说前一种递归解法是由后向前计算,那么这种解法就是由前向后计算了,

这种递归方式属于尾递归,因此在进行递归时函数只会使用第一次压栈所开辟的栈空间,在一个栈空间内循环,而不会开辟别的栈空间

所以这种方式时间复杂度为O(n),空间复杂度为O(1)是一种非常高效的递归方式。

import java.util.Scanner;
public class 高效递归求斐波那契数列 { //时间复杂度O(n),空间复杂度O(1)
   public static int Fib(int first,int sec,int n) {
       if (n==1)
           return first;
       else
           return Fib(sec,first+sec,n-1);
   }
  public static void main(String[] args) {
       Scanner scn = new Scanner(System.in);
       while (scn.hasNextInt()) {
           int n = scn.nextInt();
           System.out.println("第"+n+"个斐波那契数是"+Fib(0,1,n));
       }
   }
}

🌙递归总结

递归是一种重要的编程解决问题的方式.

有些问题天然就是使用递归方式定义的(例如斐波那契数列, 二叉树等), 此时使用递归来解就很容易.

有些问题使用递归和使用非递归(循环)都可以解决. 那么此时更推荐使用循环, 相比于递归, 非递归程序更加高效.


相关文章
|
5月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
384 18
|
5月前
|
Java 编译器 Go
【Java】(5)方法的概念、方法的调用、方法重载、构造方法的创建
Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。这种就属于驼峰写法下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。
270 4
|
5月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
365 5
|
6月前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
205 11
|
6月前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
6月前
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
1192 0
|
6月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
176 4
|
7月前
|
算法 Java
Java语言实现链表反转的方法
这种反转方法不需要使用额外的存储空间,因此空间复杂度为,它只需要遍历一次链表,所以时间复杂度为,其中为链表的长度。这使得这种反转链表的方法既高效又实用。
561 0
|
7月前
|
存储 Java 数据处理
Java映射操作:深入Map.getOrDefault与MapUtils方法
结合 `getOrDefault`方法的简洁性及 `MapUtils`的丰富功能,Java的映射操作变得既灵活又高效。合理地使用这些工具能够显著提高数据处理的速度和质量。开发人员可以根据具体的应用场景选择适宜的方法,以求在性能和可读性之间找到最佳平衡。
266 0
|
7月前
|
缓存 人工智能 NoSQL
Java中实现Token设置过期时间的方法
本文介绍了在Java应用中实现Token设置过期时间的多种方法,包括使用JWT和Redis缓存,并结合定时任务清理过期Token,以提升系统安全性与用户隐私保护。
768 0