ackage twojava;
public class _yzq_dg {
//递归
//方法内部调用自身的过程
//1.求前n项和
//2.求阶乘你!=n*(n-1)*(n-2)*(n-3)..........1
//斐波那契数列 1 1 2 3 4 5 8 13 21 第n项是?
//求前n项和请使用递归运算
// public static int Sum(int n) {
// int sum=0;
// for(int i=1;i<=n;i++) {
// sum+=i;
//
//
// }
// return sum;
//}
public static void main(String[]args) {
Sum(5);
System.out.println(Buy(20,3,5));
}
//求前n项和 使用递归 5+4+2+1(每次加的值是当前值减一)
public static int Sum(int n) {
if(n==1) {
return 1;//1的时候返回一个1
}
return n+Sum(n-1);//StackOverflowError 栈溢出错误
//5+Sum(5-1)
//5+4+Sum(4-1)
//5+4+3+Sum(3-1)
//5+4+3+2+Sum(1) 当加到1的时候结束了 结束相当于程序的出口
//连续调用自己(死循环) 这里的死循环 和for里的死循环不一样
//for的死循环是一只在执行数据
//这里的死循环是在main函数里边执行了的 每调用一个方法会在线程里边开一个栈帧(栈帧是占内存的用不了一会就占满了)
//栈比较小
//1.找到出口
//2.找规律
//将问题转移给缩小范围的子问题
}
//7.你拥有A块钱,一瓶水B块钱,每瓶水可以得到一个瓶盖,每c个瓶盖可以换一瓶水
//请写出函数求解上面题目,上面题目ABC为参数
//100 3 5个瓶盖换一瓶水 最终可以买到多少瓶水
//1.找出口(a/b(最开始瓶盖的数量)当瓶盖的数量<瓶盖单价(瓶盖可以换水的数量)
//d<c
//2.找规律 上一次数据和下一的关系 瓶盖的数量
//上一次瓶盖的数量 下一次瓶盖的数量
//d=a/b(100/3)获得瓶盖的数量以后用的话是 d%c+d/c(换完水之后得到新的瓶盖)
//买水
public static int Buy(int a,int b, int c) {
return a/b+ForCup(a/b,c);
//a/b第一次用钱买完水得到的瓶盖
}
public static int ForCup(int d ,int c) {
if(d<c) {
return 0;
}else {
return d/c+ForCup(d%c+d/c,c);
}
}
}