文章目录
1. 方法
- 递归
1. 方法
1.1方法的概念
1.2 方法定义
格式:
实现一个求闰年的方法:
public class Method{
//方法定义
public static boolean isLeapYear(int year){
if((0==year%4&&0!=year%100)||0==year%400) {
return true;
}else{
return false;
}
}
}
1.3 方法调用的执行过程
定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行
一个方法可以被多次调用
1.4 方法的重载
- 递归
2.1 什么是递归
递归,就是在运行的过程中调用自己
构成递归需具备的条件:
- 子问题须与原始问题为同样的事,且更为简单;
- 不能无限制地调用本身,须有个出口,化简为非递归状况处理
终止条件必须是在递归最开始的地方,不能把终止条件写在递归结束的位置,这样的话,递归永远退不出来了,就会出现堆栈溢出异常(StackOverflowError)
public void recursion(参数0) {
if (终止条件) {
return;
}
recursion(参数1);
}
2.2 递归实例
递归求 N 的阶乘
递推公式:N的阶乘用F(n)表示,那么F(n) = n * F(n-1);
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
int n=0;
Scanner scanner=new Scanner(System.in);
n= scanner.nextInt();
System.out.println(fac(n));
}
public static int fac(int n){
if(n==1){
return 1;
}
else{
return n*fac(n-1);
}
}
}
递归求和
F(n) 代表1到n的和,那么F(n) = n + F(n-1)的和
F(n-1)是1到n-1的和
public class Test {
public static void main(String[] args) {
int a=10;
System.out.println(sum(a));
}
public static int sum(int a){
if(a<1)
return 0;
return (a+sum(a-1));
}
}
递归打印数字的每一位
假设用F(n) 代表 要顺序打印n的每一位,如果n是一个1位数,直接输出,如果n是2位数以上。
如:
123 相当于先打印12的每一位,再打印3
12 相当于先打印1的每一位,再打印2
1 只有一位数,直接打印
依次回退打印完,每一位即可
public class Test {
public static void main(String[] args) {
int n=123456;
everypos(n);
}
public static void everypos(int a){
if(a<10){
System.out.println(a);
}
else{
everypos(a/10);
System.out.println(a%10);
}
}
}
返回的数字之和
要计算123456的每一位,主要在于如何得到每一位。在前面的习题中我们知道,除10 , 模10.可以做到
在执行n=123456的时候,先执行everypos(123456/10)也就是everypos(12345)这个函数,等最后回来之后,才会把n=123456时候的n%10算完
public class Test {
public static void main(String[] args) {
int n=123456;
System.out.println(everypos(n));
}
public static int everypos(int a){
if(a<10){
//System.out.println(a);
return a;
}
else{
return everypos(a/10)+a%10;
}
}
}
递归求斐波那契数列的第 N 项
F(n) 代表第n项斐波那契数列的值,那么F(n) = F(n-1) + F(n-2)的和
public class Test {
public static void main(String[] args) {
System.out.println(fib(3));
}
public static int fib(int n){
if(n==1||n==2){
return 1;
}
else{
return fib(n-1)+fib(n-2);
}
}
}
递归求解汉诺塔问题
public class Test {
public static void main(String[] args) {
Hanio(4,'A','B','C');
}
public static void move(char pos1,char pos3){
System.out.println(pos1 +"->"+pos3+" ");
}
public static void Hanio(int n,char pos1,char pos2,char pos3){
if(n==1){
move(pos1, pos3);
return;
}
else{
Hanio(n-1,pos1,pos3,pos2);
move(pos1,pos3);
Hanio(n-1,pos2,pos1,pos3);
}
}
}