递归算法的两道例题

来源:互联网 发布:韩语自学软件app 编辑:程序博客网 时间:2024/05/22 13:39

1.排列问题
将集合x的全排列记为Perm(x)。riPerm(x)表示在全排列Perm(x)前面加一个ri前缀。所以集合R的全排列递归的定义为:
if n=1 Perm(R) = (r) 其中r是集合R中的唯一的元素
if n>1 Perm(R) 由(r1)Perm(R1),(r2)Perm(R2),(r3)Perm(R3).。。。(rn)Perm(Rn);

import java.io.OutputStream;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.util.StringTokenizer;import java.io.IOException;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.InputStream;import java.util.*;public class Main {    public static void main(String []args){        InputStream inputStream = System.in;        OutputStream outputStream = System.out;        InputReader in = new InputReader(inputStream);        PrintWriter out = new PrintWriter(outputStream);        Task solver=new Task();        solver.solve(1,in,out);        out.close();    }    static class Task{        public void solve(int testnumber,InputReader in,PrintWriter out){            int n = in.nextInt();            int [] list = new int [n];            for(int i=0;i<n;i++){                list[i]=i+1;            }            Perm(list,0,n-1,out);        }        private void Perm(int []list,int k,int m,PrintWriter out){            if(k==m){                for(int i=0;i<=m;i++){                    out.print(list[i]+" ");                }                out.println("");            } else {                for(int i=k;i<=m;i++){                    int t=list[k];                    list[k]=list[i];                    list[i]=t;                    Perm(list,k+1,m,out);                    t=list[k];                    list[k]=list[i];                    list[i]=t;                }            }        }    }    static class InputReader {        public BufferedReader reader;        public StringTokenizer tokenizer;        public InputReader(InputStream stream) {            reader = new BufferedReader(new InputStreamReader(stream), 32768);            tokenizer = null;        }        public String next() {            while (tokenizer == null || !tokenizer.hasMoreTokens()) {                try {                    tokenizer = new StringTokenizer(reader.readLine());                } catch (IOException e) {                    throw new RuntimeException(e);                }            }            return tokenizer.nextToken();        }        public int nextInt() {            return Integer.parseInt(next());        }    }}

2.整数划分问题
将一个正整数表示成一系列正整数之和,
n = n1+n2+n3+n4+n5+….+nk(其中n1>=n2>=n3>=…..nk>=1,k>=1)
在正整数所有不同划分中,将最大加数n1不大于m的划分个数记为q(n,m),对q(n,m)建立递归关系
q(n,1) = 1,n>=1;
q(n,m)=q(n,n),m>=n;
q(n,n)=1+q(n,n-1)
q(n,m)=q(n,m-1)+q(n-m,m);

import java.io.OutputStream;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.util.StringTokenizer;import java.io.IOException;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.InputStream;import java.util.*;public class Main {    public static void main(String []args){        InputStream inputStream = System.in;        OutputStream outputStream = System.out;        InputReader in = new InputReader(inputStream);        PrintWriter out = new PrintWriter(outputStream);        Task solver=new Task();        solver.solve(1,in,out);        out.close();    }    static class Task{        public void solve(int testnumber,InputReader in,PrintWriter out){            int n = in.nextInt();            out.println(q(n,n));        }        private 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);        }    }    static class InputReader {        public BufferedReader reader;        public StringTokenizer tokenizer;        public InputReader(InputStream stream) {            reader = new BufferedReader(new InputStreamReader(stream), 32768);            tokenizer = null;        }        public String next() {            while (tokenizer == null || !tokenizer.hasMoreTokens()) {                try {                    tokenizer = new StringTokenizer(reader.readLine());                } catch (IOException e) {                    throw new RuntimeException(e);                }            }            return tokenizer.nextToken();        }        public int nextInt() {            return Integer.parseInt(next());        }    }}
原创粉丝点击