//递归小训练
public class Main
{
//从 0-n
public static void f(int n) {
if(n>0) f(n-1);
System.out.println(n);
}
//从begin 到 end
public static void f2(int begin,int end) {
if(end>begin) f2(begin , end-1);
System.out.println(end);
}
//利用递归求数组和
static int x;
public static void addAll(int[] a,int begin) {
if(begin>a.length-1) {
return ;
}else {
x+=a[begin];
addAll(a,begin+1);
}
}
//利用二分
static int y,y1,y2;
public static void addAll(int[] a,int begin,int end) {
if(begin>=end) {
y=y1+y2;
return;
}
y1+=a[begin];
y2+=a[end];
addAll(a,begin+1,end-1);
}
//目前最短代码解法
public static int f3(int[] a,int begin) {
if(begin>a.length-1) return 0;
int x=f3(a,begin+1);
return x+a[begin];
}
//不使用equal函数,使用递归
public static boolean f4(String s1,String s2) {
if(s1.length()!=s2.length()) return false;
if(s1.length()==0) return true;
if(s1.charAt(0)!=s2.charAt(0)) return false;
return f4(s1.substring(1),s2.substring(1));
}
public static void main(String args[]) {
// f(9);
// f2(15,20);
int[] a= {1,2,3,4,5,6};
addAll(a,0);
System.out.println(x);
addAll(a,0,a.length-1);
System.out.println(y);
System.out.println(f3(a,0));
System.out.println(f4("abc","abc"));
}
}
感觉还是不是非常明白 毕竟练的太少了
注意调用 栈的结构 !!
每个变量是不一样的 每个变量的地址是不一样的
我举个例子吧
就说 从0打印到3
//打印从 0-3 f(3)
public static void f(int n) {
if(n>0) f(n-1);
System.out.println(n);
}
方法f(int n=3) 此时在这个方法中的参数为3
比如内存地址是0X000000001(随便举例)这个参数也只存在于这个方法(函数)中
但是我想打印出3 必须要通过 方法f(int n=2)此时在这个方法中的参数为2
内存地址是0X000000002(随便举例)这个参数也只存在于这个方法(函数)中
但是我想打印出2 必须要通过 方法f(int n=1)此时在这个方法中的参数为1
内存地址是0X000000003(随便举例)这个参数也只存在于这个方法(函数)中
但是我想打印出1 必须要通过 方法f(int n=0)此时在这个方法中的参数为0
内存地址是0X000000003(随便举例)这个参数也只存在于这个方法(函数)中
类似栈空间(后进先出)
所以最后 打印的是 0 1 2 3(逐一返回)
而不是打印的 0
递归实现
八皇后问题
public class Main
{
static int record[][] = new int[92][9];
static int mark[] = new int[9];
static int count=0;
static boolean range[] = new boolean[9];
static boolean line1[] = new boolean[17];
static boolean line2[] = new boolean[17];
public static void dfs(int i)
{
if(i>8) {
for(int k=1;k<=8;k++) {
record[count][k]=mark[k];
}
count++;
}
for(int j=1;j<=8;j++) {
if(range[j]&&line1[i+j]&&line2[i-j+9])
{
mark[i]=j;
range[j]=line1[i+j]=line2[i-j+9]=false;
dfs(i+1);
range[j]=line1[i+j]=line2[i-j+9]=true;
}
}
return ;
}
public static void main(String args[]) {
for(int i=0;i<range.length;i++) {
range[i]=true;
}
for(int i=0;i<line1.length;i++) {
line1[i]=true;
line2[i]=true;
}
dfs(1);
for(int i=1;i<=count;i++) {
System.out.print("方案"+i+":");
for(int j=1;j<=8;j++) {
System.out.print(record[i-1][j]+" ");
}
System.out.println();
}
}
}