递归—汉诺塔、青蛙跳台阶问题、斐波那契数


前言

基于Java实现的递归的经典案例。


一、递归

相当于数学中的归纳法
两个条件:
(1)有一个起始条件——“归”。
(2)有一个递推公式——“递”。

二、案列

1.斐波那契数

斐波那契数列:
1、1、2、3、5、8、13、21、34…
递推公式:
F(1)=1,F(2)=1,
F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)

代码如下(示例):

 public static int fib(int n) {
        if(n == 1 || n == 2){
            return 1;
        }
        return fib(n - 1) + fib(n - 2);
    }

递归的效率比较低,面试的时候最好用非递归的

(2)非递归

使用循环的方法,效率会有很大的提升。

代码如下(示例):

public static int fib2(int n) {
        if(n == 1 || n == 2){
            return 1;
        }
        int f1 = 1;
        int f2 = 1;
        int f3 = 0;
        for (int i = 3; i <= n; i++) {
            f3 = f1 + f2;
            f1 = f2;
            f2 = f3;
        }
        return f2;
    }

2.青蛙跳台阶

一只青蛙跳台阶每次只能跳一个或二个台阶,有n阶台阶的时候有多少种跳法?
1台阶:1种;
2台阶:2种;->(1,1)/(2)
3台阶:3种;->(1,1,1)/ (1,2) / (2,1)
4台阶阶:5种;->(1,1,1,1)/ (1,1,2) / (1,2,1) / (2,1,1) / (2,2)

n台阶:f(n-1)+f(n-2) , n>2

这个和斐波那契数列得出的规律差不多。

代码如下(示例):

public static int jumpStage(int n) {
        if(n == 1 || n == 2) {
            return n;
        }
        return jumpStage(n - 1) + jumpStage(n -2);
    }

3.汉诺塔

这个可能理解起来有点麻烦,但是用递归实现却很简单。
假设有三个塔
A:起始位置,放了n个盘子
B:中转位置
C:目标位置(就是需要将A上的盘子移动到C上)
代码思路图大致如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码如下(示例):

/**
     * 相当于与一个能移动东西的工具
     * @param start 起始位子
     * @param end 目标位子
     */
    public static void move(char start,char end){
        System.out.print(start+"->"+end+" ");
    }

    /**
     * 汉诺塔
     * @param n 盘子的个数
     * @param start 盘子的位置
     * @param mid 中转位置
     * @param end 目标位置
     */
    public static void hanio(int n,char start,char mid,char end){
        if(n == 1){
            move(start,end);//只有一个直接从A->C
        }else {
            hanio(n-1,start,end,mid);//把n-1个盘子移到中转位子上
            move(start,end);//将剩下的一个移到目标位子上
            hanio(n-1,mid,start,end);//再将n-1个盘子移到目标位子上
        }
    }

总结

递归主要是要有‘递’和‘归’,摸清套路就很好上手。上文使用的方法递归,方法就是C语言中的函数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值