概念:
排列: P(n,r)  从n个中选r个进行排列(与顺序有关)
组合: C(n,r)  从n个中选r个进行组合(与顺序无关) 我的问题是: 我现在希望用能列出C(n,r)中所有的组合出来,即要显示每种组合的结果.
例如1: C(3,2) 从3个中,任选2个组合.
显示结果: 
1,2
1,3
2,3例如2: C(4,3) 
显示结果:
1,2,3
1,2,4
1,3,4
2,3,4现在希望把这个算法写成一个函数之类的东东. 我调用就能出结果. 

解决方案 »

  1.   

    create procedure sp_test(@n int,@r int)
    as
    begin
        set rowcount @n
        select identity(int,1,1) as num into # from sysobjects a,syscolumns b
        set rowcount 0
        
        declare @sql varchar(8000),@ord varchar(8000),@i int
        set @sql='select * from # [1]'
        set @ord='[1].num'
        set @i=1
        while @i<@r
        begin
            set @i=@i+1
            set @sql=@sql+' inner join # ['+rtrim(@i)+'] on ['+rtrim(@i)+'].num>['+rtrim(@i-1)+'].num'
            set @ord=@ord+',['+rtrim(@i)+'].num'
        end    set @sql=@sql+' order by '+@ord    print @sql
        
        exec(@sql)
    end
    goexec sp_test 5,1
    exec sp_test 5,2
    exec sp_test 5,3
    godrop procedure sp_test
    go
      

  2.   

    输出的结果自己看;如果@r值过大,可能会导致字符串长度超过8000字节,则此SP不能正确执行得到结果。另外,增加对@n和@r值的合法性判定:create procedure sp_test(@n int,@r int)
    as
    begin
        if isnull(@n,0)<isnull(@r,0)
            return     set rowcount @n
        select identity(int,1,1) as num into # from sysobjects a,syscolumns b
        set rowcount 0
        
        declare @sql varchar(8000),@ord varchar(8000),@i int
        set @sql='select * from # [1]'
        set @ord='[1].num'
        set @i=1
        while @i<@r
        begin
            set @i=@i+1
            set @sql=@sql+' inner join # ['+rtrim(@i)+'] on ['+rtrim(@i)+'].num>['+rtrim(@i-1)+'].num'
            set @ord=@ord+',['+rtrim(@i)+'].num'
        end    set @sql=@sql+' order by '+@ord    print @sql
        
        exec(@sql)
    end
    goexec sp_test 5,1
    exec sp_test 5,2
    exec sp_test 5,3
    godrop procedure sp_test
    go
      

  3.   

    ddddd
      
    *****************************************************************************
    欢迎使用CSDN论坛阅读器 : CSDN Reader(附全部源代码) 
    http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html