递归:在代码上就是自己调用自己
public class diguiapp {
public static void main(String args[]) {
fun(10);
}
static void fun(int i) {
//当i<0时结束递归
if(i<0)
return;
fun(i-1);
}
}
求n的阶乘
1.找重复:n!=n*(n-1)!,即要想知道n!,就要先求(n-1)!
(n-1)!=(n-1)*(n-2)!即要想知道(n-1)!,就要先求(n-2)!
以此类推
2.找变化:变化的量作为函数的参数
3.找边界:出口,当n=1时,结束
public class diguiapp {
public static void main(String args[]) {
System.out.print(fun(10));
}
static int fun(int n) {
if(n==1)
return 1;
//已知,fun(n)是用来求n!,那么fun(n-1)就是用来求(n-1)!
return n*fun(n-1);
}
}
打印1-100
1.找重复:要想打印1-100,就要先打印1-99,再打印100
要想打印1-99,就要先打印1-98,再打印99
以此类推
2.找变化:变化的量作为函数的参数
3.找边界:出口,当n=1时,结束
package learn;
public class diguiapp {
public static void main(String args[]) {
print(100);
}
static void print(int n) {
if(n==0)
return;
//已知,print(n)是用来打印1-n的,那么print(n-1)就是用来打印1-(n-1)的
print(n-1);
//打印完前面的1-(n-1)之后,打印n
System.out.print(n+" ");
}
}
数组求和
1.找重复:要想求下标从0-9的数组的和,可以先求0-8的和,再加上下标为9上的数
要想求下标从0-8的数组的和,可以先求0-7的和,再加上下标为8上的数
以此类推
2.找变化:变化的量作为函数的参数
3.找边界:出口,当n=0时,结束
public class diguiapp {
public static void main(String args[]) {
int[]a= {1,2,3,4,5,6,7,8,9,10};
System.out.print(addarray(a,0));
}
static int addarray(int a[],int index) {
if(index==a.length-1)
return a[index];
return a[index]+addarray(a,index+1);
}
}
翻转字符串
1.找重复:
想要翻转长度为length的字符串,先翻转第1—到length-1的,再将length位置的拼在前面
想要翻转长度为length-1的字符串,先翻转第1—到length-2的,再将length-1位置的拼在前面
以此类推
2.找变化:变化的量作为函数的参数
3.找边界:出口,当只有一个字符时,就不用翻转了
public class diguiapp {
public static void main(String args[]) {
System.out.print(reverse("abcdefg","abcdefg".length()-1));
}
static String reverse(String s,int index) {
if(index==0)
return String.valueOf(s.charAt(index));
return String.valueOf(s.charAt(index))+reverse(s,index-1);
}
}
斐波那契数列,求某一项的值
斐波那契数列:除前两项,后面每项是前两项的和
1.找重复:
已知f(n)=f(n-1)+f(n-2),要求f(n),要先求f(n-1)和f(n-2)
f(n-1)=f(n-2)+f(n-3),要求f(n-1),要先求f(n-2)和f(n-3)
f(n-2)=f(n-3)+f(n-4),要求f(n-2),要先求f(n-3)和f(n-4)
以此类推
2.找变化:变化的量作为函数的参数
3.找边界:出口,当n<2时,为1
public class diguiapp {
public static void main(String args[]) {
System.out.print(fib(10));
}
static int fib(int n) {
if(n<=2)
return 1;
return fib(n-1)+fib(n-2);
}
}
辗转相除法求最大公约数
1.找重复:
对于两个数,如果m%n=0那么最大公约数就是n
如果m%n≠0,那么k=m%n
做n%k,如果n%k=0那么最大公约数就是k
如果n%k≠0,那么k=m%n,做n%k
以此类推
2.找变化:变化的量作为函数的参数
3.找边界:出口,如果m%n=0那么最大公约数就是n
public class diguiapp {
public static void main(String args[]) {
System.out.print(max(24,4));
}
static int max(int m,int n) {
if(m%n==0)
return n;
m=m%n;
return max(n,m);
}
}