代码简洁,但涉及到的运算,会随着递归层数的增加成指数级增长
路分析:第20行20列位于45度这条线上
这条线上的数字是1 5 13 25 41...两数之差:4 8 12 16
--->每一个都是在前面的基础上+4,可以用递归或者循环
public class demo1{public static void main(String[] args){System.out.println(snack(20));}public static int snack(int n){if(n==1){return 1;}return snack(n-1)+4*(n-1);}
}
递归与循环的关系?
一道题,可以用递归解答。
1.可以换成循环解决吗-->可以-->代码量变多,运算资源(时间复杂度)
2.若发现题目用递归运行时间超出限制-->换循环 && 加字典(即动态规划)
--->加字典eg:
斐波那契数列:fn(5)=fn(4)+fn(3) fn(4)=fn(3)+fn(2)[将fn(3)和fn(2)存起来] fn(3)可以直接得出
辗转相除法:求最大公约数
1.两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数(gcd)
2.gcd(a,b)=gcd(b,a%b) (前提:a>b); 当b的值为0时,a就是要求的最大公约数
eg:
12&4=4&0=4
10&7=7&3=3&1=1&0=1
输入两个数,求最小公约数
法1:循环解法
public class demo2{public static void main(String[] args){//a>b gcd(a,b)=gcd(b,a%b)int a=scan.nextInt();int b=scan.nextInt();while(b!=0){int c=a%b;a=b;b=c;}System.out.println(a);}
}
法2:递归解法
public class demo3{public static void main(String[] args){Scanner scanner=new Scanner(System.in);int a=scanner.nextInt();int b=scanner.nextInt();int zz=zz(a,b);System.out.println(zz);}public static int zz(int a,int b){if(b==0){return a;}int c=a%b;return zz(b,c);}
}