Java学习笔记(12)——方法的递归

这里将自己学习java及其应用的一些笔记、积累分享一下,如果涉及到了文章、文字侵权,请联系我删除或调整。


一、方法的递归

1.1 概述

  • 在方法中,调用自身
    void f() {
         f();
    }
     

f()方法求阶乘

f(5)

f(4)

f(3)

f(5)

     5*f(4)

           4*f(3)

                 3*f(2)

                       2*f(1)

                              1*f(0)

  • 把复杂问题,一步一步地简化,简化成最简问题,再反向倒推,求出结果
  • 一般不同时做多次递归调用,否则运算量会急剧增加,应考虑用循环代替

​​​​​​​​​​​​​​1.2 练习:递归求阶乘

项目:递归求阶乘
类:Test1

package day0603;

import java.util.Scanner;

public class Test1 {

	public static void main(String[] args) {
		System.out.print("输入整数求阶乘:");
		int n = new Scanner(System.in).nextInt();
		long r = f(n);
		System.out.println(r);
	}
	private static long f(int n) {
		//阶乘的最简问题
		if(n == 0) {
			return 1;
		}

		return n*f(n-1); //递归调用自身
	} 
}

 

1.2 练习:递归求斐波那契数

1 1 2 3 5 8 13 21 34 55 89 144 233 ...
项目:斐波那契数
类:Test1

package day0604;

import java.util.Scanner;

public class Test1 {
	public static void main(String[] args) {
		System.out.print("求第几个斐波那契数:");
		int n = new Scanner(System.in).nextInt();
		long r = g(n);
		System.out.println(r);
	}
	private static long g(int n) {
		/*
		 * 1 1 2 3 5 8
		 * a b
		 *
		 * b=a+b
		 * a=b-a
		 */
		long a = 1;
		long b = 1;

		if(n==1 || n==2) {
			return 1;
		}

		//从第3个,求到第n个
		for(int i=3; i<=n; i++) {
			b=a+b;
			a=b-a;
		}
		return b;
	}
	//反例,效率极低
	private static long f(int n) {
		//斐波那契数最简问题
		if(n==1 || n==2) {
			return 1;
		}

		return f(n-1) + f(n-2);
	} 
}

1.3 练习:求汉诺塔

项目:递归求汉诺塔
类:Test1

package day0605;

import java.util.Scanner;

public class Test1 {
	public static void main(String[] args) {
		System.out.print("玩几层汉诺塔:");
		int n = new Scanner(System.in).nextInt();
		f(n, "A", "B", "C");
	}

	private static void f(
			int n,
			String z1,
			String z2,
			String z3) {
		if(n==1) { //最简问题
			System.out.println(z1+"->"+z3);
			return;
		}
		//n层简化成n-1层,递归玩n-1层汉诺塔
		//从z1,经过z3配合,到z2
		f(n-1, z1, z3, z2);
		//最底下一层,直接从z1到z3
		System.out.println(z1+"->"+z3);
		//z2上的n-1层汉诺塔,经过z1配合,移动到z3
		f(n-1, z2, z1, z3);
	} 
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值