HNUCM-OJ 递归(java)

汉诺塔

/**
汉诺塔
 */

import java.util.Scanner;
public class Main {
   static int step=0;

  static   void move(int n, char a, char b) {
      System.out.println("move "+(++step)+" from "+a+" to "+b);

    }


public static  void  hanoi(int n,char a,char b ,char c){
    if(n>0){
        hanoi(n-1,a,c,b);
        move(n,a,c);
        hanoi(n-1,b,a,c);
    }
}

    public static void main(String[] args) {

        Scanner cin = new Scanner(System.in);
        int n = cin.nextInt();//行
        hanoi(n,'A','B','C');

    }
}





全排列

/**
全排列
 */

import java.util.Scanner;
public class Main {
   public static void perm(int list[], int k,int n) {
        int i,t;
        if(k==n) {
            for(i=0; i<=n; i++) {
                System.out.print(list[i]+" ");

            }
            System.out.println();
        }

        for(i=k; i<=n; i++){
            {t=list[k]; list[k]=list[i]; list[i]=t;}
            perm(list,k+1,n);
            {t=list[i]; list[i]=list[k]; list[k]=t;}
        }
    }


    public static void main(String[] args) {

        Scanner cin = new Scanner(System.in);
        int n=cin.nextInt();
       int arr[]=new int[n];
       for(int i=0;i<arr.length;i++){
           arr[i]=cin.nextInt();
       }
        perm(arr,0,arr.length-1);

    }
}

九数组分数

题目描述

1, 2, 3…9 这九个数字组成一个分数,其值恰好为1/3,要求每个数字出现且只能出现一次,如何组合?编写程序输出所有的组合。

输入

输出

输出所有的结果,如果有多个,每条结果占一行。
结果的格式 : xxxx/xxxxx ,按照分子从小到大的顺序输出。

import java.util.Scanner;
 
public class Main {
    public static void test(int[] Array) {//首先判定份为1的占四位数,份为5的占五位数
        int a = Array[0]*1000+Array[1]*100+Array[2]*10+Array[3];//份为1的占四位数
        int b = Array[4]*10000+Array[5]*1000+Array[6]*100+Array[7]*10+Array[8];//份为5的占五位数
        if(a*3==b) {  //满足条件
            System.out.println(a+"/"+b);
        }
    }
 
    public static void perm(int[] a,int k,int n){
        int i;
        int t;
        if(k==n){
            test(a);
        }
        for(i=n;i>=k;i--){
            {t=a[k];a[k]=a[i];a[i]=t;}
            perm(a,k+1,n);
            {t=a[i];
            a[i]=a[k];
            a[k]=t;
            }
             
        }
    }
 
    public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
       
           int Array[]= {1,2,3,4,5,6,7,8,9};
           int len=Array.length;
           perm(Array,0,len-1);
           System.out.println(" ");
            
        
        
    }
}

超级青蛙

题目描述

一只超级青蛙一次可以跳上1级台阶,也可以跳上2级……它也能够跳上n级台阶。请问,该青蛙跳上一个n级的台阶总共有多少种跳法?

输入

输入一个正整数n表示台阶的数量。

输出

输出总的跳法数。

样例输入 Copy

1
2

样例输出 Copy

1
2

import java.util.Scanner;
 
public class Main {
    public static int digui(int n) {
        if(n==1) {
            return 1;
        }else {
            return digui(n-1)*2; 
            //  F(n)=F(n-1)+F(n-2)+…F(1)+1
            //F(n-1)= F(n-2)+…F(1)+1
                //  两式相减得F(n)=2F(n-1) ;
        }
    }
     
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
            while(sc.hasNext()) {
                int n=sc.nextInt();
                System.out.println(digui(n));
                 
            }
             
            }
         
             
             
        }

斐波那契数

题目描述

Kimi号称自己已经记住了1-100000之间所有的斐波那契数。
为了考验他,我们随便出一个数n,让他说出第n个斐波那契数。
当然,斐波那契数会很大。
因此,如果第n个斐波那契数不到6位,则说出该数;否则只说出最后6位。

输入

输入有多组数据。
每组数据一行,包含一个整数n (1≤n≤100000)。

输出

对应每一组输入,输出第n个斐波那契数的最后6位。

样例输入 Copy

1
2
3
4
100000

样例输出 Copy

1
2
3
5
537501

import java.util.*;
public class Main {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner cin = new Scanner(System.in);
        int []result = new int[100001];
        result[0]=1;
        result[1]=1;
        for(int i=2;i<100001;i++){
            result[i] = (result[i-1]+result[i-2])%1000000;
        }
        while(cin.hasNext()){
            int n = cin.nextInt();
            System.out.printf(n<25?"%d\n":"%06d\n",result[n]);
        }
         
    }
}

蜂房

题目描述

有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。

在这里插入图片描述

输入

多组数据输入,每组数据包含两个正整数a, b,且 a<b。

输出

蜜蜂从蜂房a爬到蜂房b的可能路线数。

样例输入 Copy

1 2
3 4

样例输出 Copy

1
1

import java.util.ArrayList;
import java.util.Scanner;
  
 
public class Main {
    public static int s(int n) {
        if(n==0||n==1) {
            return 1;
        }
            return s(n-1)+s(n-2);
         
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
         
        while (scanner.hasNext()) {
            int a = scanner.nextInt();
            int b = scanner.nextInt();
            if(a>b) {
                int t;
                t=a;
                a=b;
                b=t;
            }
            int num = b - a;
            System.out.println(Main.s(num));
             
        }
 
    }    
  
}

数字求和

题目描述

使用递归编写一个程序,计算一个正整数中所有数字之和。例如输入234,输出9

输入

多组输入,每组输入一个正整数。

输出

输出结果,每个结果占一行。

样例输入 Copy

234

样例输出 Copy

9

import java.util.*;
import java.util.Scanner;
  
 
public class Main {
     
   public static int sum(int n) {
       if(n==0) {
           return 0;}
       return sum(n/10)+n%10;
        
        
   }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
         
        while (scanner.hasNext()) {
            int n;
            n=scanner.nextInt();
            System.out.println(Main.sum(n));
 
    }  
         
         
         
         
         
    }
}
 

XP的楼梯

题目描述

XP是个淘气的孩子,他最近迷上了跳楼梯。他可以一次跳一级,也可以一次跳两级,他居然还能够一次跳三级楼梯(危险动作,请勿模仿)。某次,XP在跳完楼梯后突然想到一个问题,如果有n级楼梯,他从第一级开始往上跳,一直跳到第n级共有多少种不同的方案?你能帮他解决这个问题吗?当然,如果只有一级楼梯,很明显他只有一种选择。

输入

单组输入数据 n (0<n<30)

输出

输出一行结果

样例输入 Copy

29

样例输出 Copy

15902591

import java.util.Scanner;
public class Main {
     public static int s(int n) {
         if(n==1||n==2) {
             return 1;
         }else if(n==3) {
             return 2;
         }else
             return s(n-1)+s(n-2)+s(n-3);
     } 
    public static void main(String[] args) {
        
        Scanner cin=new Scanner(System.in);
        int n=cin.nextInt();
        System.out.println(Main.s(n));
    }    
 
         
         
    }

字符统计

题目描述

输入一行字符串(字符串长度小于10000,由大小写字母、阿拉伯数字和空格组成),分别统计出其中大写英文字母,小写英文字母、阿拉伯数字和空格的个数。

输入

一行字符串(字符串长度小于10000,由大小写字母、阿拉伯数字和空格组成)

输出

分别输出大写英文字母,小写英文字母、阿拉伯数字和空格的个数,用空格隔开

样例输入 Copy

h0u84nfx 7

样例输出 Copy

0 5 4 1

import java.util.Scanner;
public class Main {
     static int A = 0;
    static int a1 = 0;
    static int num =0;
    static int countA =0;
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);//扫描器,接受控制台的输入
        String scanStr = scan.nextLine();//取出控制台的一行信息
        
        char[] a = scanStr.toCharArray();//将接收到的字符串变成字符数组
        for(int i = 0;i<a.length;i++){
            if(a[i]>64&&a[i]<91) {
                A+=1;
            }else if(a[i]>=97&&a[i]<=122) {
                a1+=1;
            }else if((int)a[i]>47&&(int)a[i]<=57) {
                num+=1;
            }else {
                countA+=1;
            }
             
        }
        System.out.print(A);
        System.out.print(' ');
        System.out.print(a1);
        System.out.print(' ');
        System.out.print(num);
        System.out.print(' ');
        System.out.print(countA);
         
         
    }    
 
         
         
    }

数的划分

题目描述

使用递归编写一个程序,求一个正整数n的所有划分个数。
例如,输入3,输出3;输入4,输出5。

输入

多组输入,每一组是一个正整数n。

输出

输出划分数。

样例输入 Copy

3
4

样例输出 Copy

3
5

import java.util.Scanner;
 
public class Main {
     
 //将n的最大加数不大于m的划分个数记作q(n,m)
    public static int q(int n, int m) {
        if (n < 1 || m < 1) 
            return 0;
        if (n == 1 || m == 1) 
            return 1;
        if (n < m)
            return q(n, n);
        if (n == m) 
            return q(n, m - 1) + 1;
        return q(n, m - 1) + q(n - m, m);
    }
 
 
    public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
       
         int n;
         while(cin.hasNext()) {
         n=cin.nextInt();
          int s= q(n,n);
           System.out.println(s);
         }
        
        
    }
}

猜你喜欢

转载自blog.csdn.net/qq_45353823/article/details/106225091