递归
问题一:递归求 1 + 2 + 3 + … + 10
public static void main(String[] args) {
int a = 10;
System.out.println(sum(a));
}
public static int sum(int a){
if (a == 1){
return 1;
}
return a+sum(a-1);
}
问题二:写一个递归方法,输入一个非负整数,返回组成它的数字之和.
例如,输入 1729, 则应该返回1+7+2+9,它的和是19
public static void main(String[] args) {
int a = 1729;
System.out.println(sum(a));
}
public static int sum(int a){
int num = a%10;
if (a < 10){
return num;
}
return num+sum(a/10);
}
问题三:求斐波那契数列的第 N 项
public static void main(String[] args) {
int a = 6;
System.out.println(sum(a));
}
public static int sum(int a){
int f1 = 1;
int f2 = 2;
if (a == 1){
return f1;
}
if (a == 2 ){
return f2;
}
return sum(a-1)+sum(a-2);
}
问题四:递归求n得阶乘
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
System.out.println(factor(a));
}
public static int factor(int a){
if (a == 1){
return 1;
}
return a*factor(a-1);
}
此时要注意 int 类型得范围
问题五:求汉诺塔
汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。
问应该如何操作?
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
hanoiTower(a,'a','b','c');
}
public static void hanoiTowerMove(char m1,char m2){
System.out.print(m1+"->"+m2+" ");
}
public static void hanoiTower(int a,char m1,char m2,char m3){
if (a == 0){
return;
}
if (a == 1){
hanoiTowerMove(m1,m3);
return;
}
hanoiTower(a-1,m1,m3,m2);//将剩余的a-1个盘子从a经c转到b
hanoiTowerMove(m1,m3);//将剩下的那一个转到c
hanoiTower(a-1,m2,m1,m3);//将b上的a-1个盘子经a转到c
}
问题五:青蛙跳台阶问题
一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
System.out.println(fib(a));
}
public static int fib(int a){
if (a == 0){
return 0;
}
if (a == 1){
return 1;
}
if (a == 2){
return 2;
}
return fib(a-1)+fib(a-2);
}
就是斐波那契数列
其他
问题一:给定一个数,判断其是否为素数
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int i = 2;
if (a <=0){
System.out.println("不是素数");
return;
}
while (i < a){
if (a % i == 0 ){
System.out.println("不是素数");
break;
} else {
i++;
}
}
if (i >= a){
System.out.println("是素数");
}
}
也可以对代码进行优化
1、当 a 不是素数是,a = m*n 且 m 或 n < a/2,则当 a 对 m 或 n 取余时结果为0
则可以定义 i < a/2
2、i <=Math.sqrt( a )
问题二:求两个正整数的最大公约数
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
while (a % b != 0 ){
int num = a % b;
a = b;
b = num;
}
System.out.println(b);
}
问题三:计算 1/1 - 1/2 + 1/3 - 1/4 +…+ 1/99 - 1/100 的值
方法一
public static void main(String[] args) {
double num = 0;
double num2 = 0;
for (int i = 1; i <= 100; i++){
if (i % 2 != 0){
num+=1.0/i;
} else {
num2+=1.0/i;
}
}
double sum = num-num2;
System.out.println(sum);
}
方法二
public static void main4(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
double sum = 0;
int tmp = 1;
for (int i = 1; i <= a ; i++) {
sum+=(1.0/i)*tmp;
tmp=-tmp;
}
System.out.println(sum);
}
问题四:自幂数(水仙花数)
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
for (int i = 1; i < a; i++) {
int sum = 0;
int tmp = i;
int count = 0;//计算这是一个几位数
while (tmp !=0){
count++;
tmp/=10;
}
tmp = i;
while (tmp != 0 ){
sum+=Math.pow(tmp%10,count);// tmp % 10 的 count 方
tmp/=10;
}
if (sum == i){
System.out.println(i+"是自幂数");
}
}
}
问题五:模拟三次密码输入的场景
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int count = 3 ;
while (count != 0 ) {
String passWord = sc.nextLine();//输入放在循环体内实现多次输入
if (passWord .equals("123456")){
System.out.println("密码正确");
break;
}
count--;
System.out.println("密码错误");
System.out.println("你还有"+count+"次机会");
}
}
问题六:内存当中存储,二进制为一的个数
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a=sc.nextInt();
int count = 0;
while (a != 0){
count++;
a=a&(a-1);
}
System.out.println(count);
}
问题七:获取一个数二进制序列中所有的偶数位和奇数位,分别输出
public static void main(String[] args) {
int a = 7;
System.out.println("偶数位");
for (int i = 1; i <= 32; i = i + 2) {
System.out.print( (a>>i) & 1 );//将a的二进制序列右移一位,向左边添加一个符号位之后在与1按位与
}
System.out.println("奇数位");
for (int i = 2; i <=32 ;i = i + 2) {
System.out.print( (a>>i) & 1 );
}
}
问题八:完成猜数字游戏
public static void main(String[] args) {
Random rd = new Random();
Scanner sc = new Scanner(System.in);
int rand=rd.nextInt(100)+1;//随机生成的一个数字和其范围,这里给定的范围是1-100
while (true){
System.out.println("请输入你要猜的数字");
int a = sc.nextInt();
if (a == rand){
System.out.println("猜对了");
break;
}else if (a < rand){
System.out.println("猜小了");
}else{
System.out.println("猜大了");
}
}
}
问题九:有一组数据,只有一个数字是出现一次,其他是两次,请找出这个数字
public static void main(String[] args) {
int[] arr = {1,1,2,8,5,8,2};
int a = 0;
for (int i = 0; i < arr.length; i++) {
a = a^arr[i];
}
System.out.println(a);
}