欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

辅导资料 历年递归试题

程序员文章站 2022-06-20 12:15:31
...

一、反转串

辅导资料 历年递归试题
代码如下:

/*
 * 构造递归的要诀:
 * 1.找到相似性
 * 2.定义出口
 */
package sf_1;
public class Main {
    public static String reverseString(String x){
        if(x==null||x.length()<2)
            return x;
        return   reverseString( x.substring(1))+x.charAt(0);
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.print(reverseString("abcd"));
    }
}

运行截图:
辅导资料 历年递归试题

二、杨辉三角形
辅导资料 历年递归试题

代码如下;

package sf_2;

public class Main {
    /*
     * 1
     * 1 1
     * 1 2 1
     * 1 3 3 1
     * 1 4 6 4 1
     * 1 5 10 10 5 1
     */
    public static int f(int m,int n){
        if(m==0)
            return 1;
        if(n==0||n==m)
            return 1;
        return f(m-1,n)+f(m-1,n-1);
    }
    public static void main(String[] args) {
        int level=5;
        for(int i=0;i<=level;i++)
            System.out.print(f(level,i)+" ");
                System.out.println();
}

}

运行截图:

辅导资料 历年递归试题

三、
辅导资料 历年递归试题

代码如下:

package sf_3;
public class Main {
    /*
     * m个A,n个B,组成多少排列
     */
    public static int f(int m,int n){
        if(m==0||n==0)
            /*
             * 它的意思是当n=0时,此时仅仅剩下a,则只有一种情况;同理,
             *           当m=0时,此时仅仅剩下b,则只有一种情况
             */
            return 1;
        return f(m-1,n)+f(m,n-1);
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.print(f(3,2));
    }
}

运行结果:
辅导资料 历年递归试题

四、
辅导资料 历年递归试题
代码如下:

package sf_4;
public class B {
    /*
     * 对于n进行加法划分
     * 存一个数组a缓冲;当前位置k;
     */
    public static void f(int n,int a[],int k){
         /*
         * 递归出口
         */
        if(n<=0){
            for(int j=0;j<k;j++){
                if(j==k-1)
                    System.out.print(a[j]);
                else
                    System.out.print(a[j]+"+");
            }
            System.out.println();
            return;
        }
        for(int i=n;i>=1;i--){
            /*
             * 应当保证前一个比后一个数大
             */
            if(k>0&&i>a[k-1])
                continue;
            a[k]=i;
            f(n-i,a,k+1);
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int a[]=new int[1000];
        f(6,a,0);
    }
}

五、
辅导资料 历年递归试题

代码如下:

package sf_5;
public class B {
    /*
     * err_sum表示有错的和
     * a:明细,只是传入 并不修改
     * k:当前处理的位置
     * cur_sum:前边的元素的累加和
     * b:记录取舍
     */
    public static void g(int err_sum,int a[],int k,int cur_sum,boolean[] b){
        //已经大于err_sum  不满足条件
        if(cur_sum>err_sum) return;

        //问题得到了一个解,哪些项没有选
        if(cur_sum==err_sum){
            for(int i=0;i<b.length;i++)
                if(b[i]==false)
                    System.out.print(i+" ");
                System.out.println();
                return;

        }

        //当前项已经到尾了
        if(k>=a.length) return;

        b[k]=false;
        g(err_sum,a,k+1,cur_sum,b);

        /*
         * 将其设置为了true 
         * 在回溯的时候应当设置为false
         */
        b[k]=true;;
        cur_sum+=a[k];//选中了第k个元素
        g(err_sum,a,k+1,cur_sum,b);
        b[k]=false; 
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int sum=6;//总和是6
        int[] a={3,2,4,3,1};
        //表示a的对应项是否选取
        boolean[] b=new boolean[a.length];
        g(6,a,0,0,b);
    }
}

运行截图:
辅导资料 历年递归试题

相关标签: 递归