【递归】详解+例题(斐波那契数 + 吃桃问题)

目录

作用:

题目:

斐波那契数:        1,1,2,3,5,8,13,21......给你一个整数n(第几个数),求出它的值是多少吃桃子问题:         有一堆桃子,每天按照 吃一半 并且再 多吃一个 的方式吃,                                            当第 day 天的时候,发现只剩下一个桃子了,问 一开始有多少桃子

结果:

 代码(包含思路):

内存图:


作用:

        我的理解是:再已知结果和条件的情况下,取反推(求) 过程 和 最开始

        总结:也就是 逆向推导!

题目:

斐波那契数:
        1,1,2,3,5,8,13,21......给你一个整数n(第几个数),求出它的值是多少
吃桃子问题:
        有一堆桃子,每天按照 吃一半 并且再 多吃一个 的方式吃,                                            当第 day 天的时候,发现只剩下一个桃子了,问 一开始有多少桃子

结果:

 代码(包含思路):

package com.gao.test.recursion;

import java.util.Scanner;

/**
 * @Author lie
 * @Description 斐波那契数 + 吃桃问题
 * 递归练习:
 *      ①   1,1,2,3,5,8,13,21......给你一个整数n(第几个数),求出它的值是多少
 *      ②   吃桃子问题: 有一堆桃子,每天按照 吃一半 并且再 多吃一个 的方式吃,
 *                      当第 day 天的时候,发现只剩下一个桃子了,问 一开始有多少桃子
 */
public class Fibonacci {
    public static void main(String[] args) {
        RecursionUtil utils = new RecursionUtil();
        Scanner input = new Scanner(System.in);
        System.out.println("请输入要查询第几位的斐波那契数:");
        int n = input.nextInt();
        int i = utils.FibonacciMath(n);
        if(-1 == i){
            System.out.println("请输入大于0的正整数");
        }else {
            System.out.println("第"+ n +"位对应的斐波那契数是:"+i);
        }
        int totalPeach = utils.eatPeach(n);
        if(-1 == totalPeach){
            System.out.println("请输入正确的天数");
        }else {
            System.out.println("第"+ n +"天时只剩一个桃子,那么一开始有 "+totalPeach+" 个桃子");
        }
    }
}
package com.gao.test.recursion;

/**
 * @Author lie
 * @Description 递归工具类
 */
public class RecursionUtil {
    /**
     * 斐波那契数工具
     * @param n  传入得出第几个数
     * @return  得出的第n位置的斐波那契数
     */
    public int FibonacciMath(int n){
        /*
        思路:  当 n = 1 、2 时 返回1
               当 n 是其它数(>0), 则是前两个数的和
         */
        if(0 >= n){
            //提示请输入>0的正整数
            return -1;
        }else if(1 == n || 2 == n){
            return 1;
        }else{
            return FibonacciMath(n-1)+FibonacciMath(n-2);
        }
    }

    /**
     * 吃桃子问题: 有一堆桃子,每天按照 吃一半 并且再 多吃一个 的方式吃,
     *           当第 day 天的时候,发现只剩下一个桃子了,问 一开始有多少桃子
     * @param day 第几天的时候,只剩下一个桃子
     * @return 一开始有多少桃子
     */
    public int eatPeach(int day){
        /*
         思路:已知最后结果和条件,求一开始(典型的递归)
               最后一天          剩 1个
               倒数第二天        剩 (1+1)*2 = 4 个
               倒数第三天        剩 (4+1)*2 = 10 个
         */
        if(0 >= day){
            //提示请输入>0的正整数
            return -1;
        }else if(1 == day ){
            return 1;
        }else{
            return (eatPeach( day-1) + 1) * 2;
        }
    }
}

内存图:

        只有斐波那契数 n=4的情况下的(后面的推导都一样了)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值