递归与循环


递归 本质 main()—f()—[大中华总裁做一部分工作]+[区域经理做一部分工作]
[区域经理] == [省级代理]…
求 打印输出 从a----b,
import java.io.IOException;
import java.util.Scanner;
public class one {
public static void main(String[] args)throws IOException{
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
f1(n);
}
public static void f1(int end){
if(end==-1)return;
System.out.println(end);
f1(end-1);
}
public static void f2(int begin,int end){
if(begin>end)return;
System.out.println(begin);
f2(begin+1,end);
}
}
输出 数组内,几个数 相加的和
(1)求 数组a中,从数组下标begin开始到下标end结束,所有数值的和,扩展肯定也可以求积

思路是 a(begin) + [a(begin-1)+…]
import java.io.IOException;
import java.util.Scanner;
public class one {
public static void main(String[] args)throws IOException {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int [] a = new int [n];
for (int i = 0; i < a.length; i++) {
a[i]=scanner.nextInt();
}
int begin = scanner.nextInt();
int end = scanner.nextInt()+1;
System.out.println(f(a,begin,end));
}
public static int f(int [] a,int begin,int end) {
if(begin==end)return 0;
int x=f(a,begin+1,end);
return a[begin]+x;
}
}
思路是 a(end) + [a(end-1)+…]
import java.io.IOException;
import java.util.Scanner;
public class one {
public static void main(String[] args)throws IOException {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int [] a = new int [n];
for (int i = 0; i < a.length; i++) {
a[i]=scanner.nextInt();
}
int begin = scanner.nextInt();
int end = scanner.nextInt();
System.out.println(f(a,begin,end));
}
public static int f(int [] a,int begin,int end) {
if(end==begin)return 0;
int x=f(a,begin,end-1);
return a[end]+x;
}
}
折半求和
import java.io.IOException;
import java.util.Scanner;
import javax.sound.midi.MidiChannel;
public class one {
public static void main(String[] args)throws IOException {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int [] a = new int [n];
for (int i = 0; i < a.length; i++) {
a[i]=scanner.nextInt();
}
int begin = scanner.nextInt();
int end = scanner.nextInt();
int mid = (begin+end)/2;
System.out.println(f(a,begin,mid)+f(a,mid,end));
}
public static int f(int [] a,int begin,int end) {
if(begin==end)return 0;
int x=f(a,begin+1,end);
return a[begin]+x;
}
}
判断两个字符串,是否相同。

1.equals
import java.io.IOException;
import java.util.Scanner;
public class one {
public static void main(String[] args) throws IOException{
System.out.println(isSameString("abc", "abc"));
}
public static boolean isSameString(String s1,String s2) {
return s1.equals(s2);
}
}
(2)方法
substring(x)是从字符串的的第x个字符截取
substring(x,y)是从x到y前的位置停止
(1)每次都判断 s1.length是否等于 s2.length.运用substring(1),重新截取数组,从第一个字符截取,即不包含第一个。两个数组同时都变为空,为true,但是因为 每次都判断 s1.length是否等于s2.length,所以 只需要 判断s1.length是否等于 0,等于0即为true. 不等于0,继续下边的判断
import java.io.IOException;
import java.util.Scanner;
public class one {
public static void main(String[] args) throws IOException{
System.out.println(f1("abc", "abc"));
}
public static boolean f1(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 f1(s1.substring(1), s2.substring(1));
}
}
(3)方法
(1)不每次都判断s1.length是否等于s2.length.运用substring(1),重新截取数组,从第一个字符截取,即不包含第一个。取一个数组变空,另外一个不变空,即为false. 两个数组同时都变为空,为true
import java.io.IOException;
import java.util.Scanner;
public class one {
public static void main(String[] args) throws IOException{
System.out.println(f1("abc", "abcd"));
}
public static boolean f1(String s1,String s2) {
if (s1.length()==0 && s2.length()==0) {
return true;
}
else if (s1.length()==0 && s2.length()!=0) {
return false;
}
else if (s1.length()!=0 && s2.length()==0) {
return false;
}
if (s1.charAt(0)!=s2.charAt(0)) return false;
return f1(s1.substring(1), s2.substring(1));
}
}


