递归算法的两道例题

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());
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值