递归的切蛋糕思想和求斐波那契数列第n项

递归:

1、找重复

2、找重复中的变化量(参数)

3、找参数变化趋势(设计出口)

方法或函数的内部调用了自己就是递归(栈结构)

递归基础练习:

切蛋糕的思想,切掉一小部分,剩下的给别人

先找自己做的那部分,再找程序出口

1、求一个数的阶乘

 /*找重复 n*(n-1)的阶乘,将f1(int m)的功能就看为是求阶乘的,所以m直接乘以f(m-1)
    找变化,变化的量应该作为参数
    找边界:出口 到1
    */
    private static long f1(int m) {
        if (m == 1) {
            return m;
        }

        return m*f1(m-1);

    }

2、打印从i到j

我只做打印i (从这切开),剩下的交给别人

   /*打印i到j
     /*找重复
    找变化,变化的量应该作为参数
    找边界:出口 i>j
    * 我做一部分,剩下的交给其他人做*/
    private static void f2(int i, int j) {
        if (i>j)
            return;
        System.out.println(i);
        f2(i+1,j);
    }

3、数组求和

我只做第一个元素相加后面的数组元素,剩下的交给别人

  /*数组求和,加参数
    * 找重复 我做一部分,剩下的交给其他人做,最简单的就是我只做第一个元素相加后面的数组元素
    找变化,变化的量应该作为参数
    找边界:出口 下标到最后*/
    private static long f3(int[] arr,int begin) {
        if (begin==arr.length-1)
            return arr[begin];
       return arr[begin]+f3(arr,begin+1);
    }

4、反转字符串

这个从后面切

image-20210806090153866

 /*翻转字符串
    * 切蛋糕思想,我只做一部分,剩下的交给其他人,这样找出重复部分,
    * 之后再找程序的出口  end是字符串的下标索引,从0开始**
     */
    public static String reverse(String src,int end){
        if (end==0){
            return ""+src.charAt(0);
        }
        return src.charAt(end)+reverse(src,end-1);
    }

5、斐波那契数列

递归可以分解为

1、直接量+ 小规模子问题(上面的例子,只切一个很小的直接量蛋糕,划一刀)

2、多个小规模子问题(本例子就是 f(n-1)+f(n-2) )

n是第几项

  public static void main(String[] args) {
     //求第五项
        long t = fib(5);
        System.out.println(t);

    }
public  static long fib(int n){
        //当是第一项或者第二项的时候
        if (n==1 || n==2){
            return 1;
        }
        return fib(n-1)+fib(n-2);
    }

上面的几个例子都是单分支(只有一个分支),而斐波那契数列是两分支(找了两个小弟)

image-20210806094507976斐波那契数列的运算顺序
image-20210806095004542

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值