递归的练习

本文通过多个实例展示了递归在编程中的应用,包括计算阶乘、斐波那契数列、汉诺塔问题、青蛙跳台阶问题以及判断素数等。递归作为一种强大的编程工具,能解决复杂问题,并在代码中展现出简洁之美。同时,文章还涉及了最大公约数计算、数字序列求和、自幂数判断和密码验证等算法。通过对这些实例的解析,读者可以深入理解递归的工作原理及其在实际问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

递归

问题一:递归求 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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值