目录
作用:
我的理解是:再已知结果和条件的情况下,取反推(求) 过程 和 最开始
总结:也就是 逆向推导!
题目:
斐波那契数:
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的情况下的(后面的推导都一样了)