中易网

c#语言.输出从数组a中取n个数的所有排列(可以重复)

答案:3  悬赏:40  
解决时间 2021-02-11 16:29
c#语言.输出从数组a中取n个数的所有排列(可以重复)
最佳答案
//题主没说明什么类型的数组作为输入,做了个泛型数组的例子
using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    class Program
    {
        private static void printArray(IEnumerable ou)
        {
            foreach (var o in ou)
            {
                foreach (var item in o)
                {
                    Console.Out.Write(item);
                    Console.Out.Write(',');
                }
                Console.Out.WriteLine();
            }
        }

        static void Main(string[] args)
        {
            //测试3个元素的int数组,取样2个的排列
            //var testArray1 = ;
            printArray(GetPermutationN(new int[] { 1, 2, 3 }, 2));

            //测试4个元素的string数组,取样3个的排列            
            printArray(GetPermutationN(new string[] { "a", "b", "c", "d" }, 3));

        }

        public static IEnumerable GetPermutationN(T[] sourceArray, int permutationLength)
        {
            foreach (var index in getPermutationIndex(sourceArray.Length, permutationLength))
            {
                var rtnRow = new List();
                foreach (var i in index)
                    rtnRow.Add(sourceArray[i]);
                if (rtnRow.Count == permutationLength)
                    yield return rtnRow.ToArray();
            }
        }

        /// 
        /// 获取arrayLenght长度数组的permLength长度的排列
        /// 所使用的乘方式递归函数
        /// 

        /// 
        /// 样本元素数组的长度
        /// 
        /// 
        /// 从样本数组中取样的个数
        /// 
        /// 
        /// 返回样本元素数组下标矩阵
        /// 

        private static IEnumerable getPermutationIndex(int arrayLenght, int permLength)
        {
            for (int i = permLength; i > 0; i--)
            {
                if (i > 1)
                {
                    var recursion = getPermutationIndex(arrayLenght, i - 1);
                    for (int j = 0; j < arrayLenght; j++)
                        foreach (var item in recursion)
                        {
                            var rtnRow = new List();
                            rtnRow.Add(j);
                            rtnRow.AddRange(item);
                            yield return rtnRow.ToArray();
                        }
                }
                else
                    for (int j = 0; j < arrayLenght; j++)
                        yield return new int[] { j };
            }
        }
    }
}
全部回答
private void button1_Click(object sender, EventArgs e)         {             string[] a={"1","2","3"};             int n = 2;             object[] r = combine(a, n);             foreach (var item in r) Console.WriteLine(item.ToString());          }         private object  []  combine( string[] sourceArray, int n)         {             if (n>1)             {             System.Collections .ArrayList r=new System.Collections.ArrayList ();             for (int i = 0; i < sourceArray.Length; i++)             {                 object[] ar = combine(sourceArray, n-1);                 for (int j = 0; j < ar.Length; j++)                 {                     ar[j] = sourceArray[i] + ar[j];                     r.Add (ar[j]);                 }                            }               return r.ToArray ();             }         else                 {                 return sourceArray.ToArray  ();                                 }         }
因为可以重复,其实就是一个嵌套循环。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
为什么身体会热不起来?
出发机场是Departure Airfield. 那么目的机场
嫩江市黑河育苗幼儿园(Z649)地址是什么,有没
云南女人多还是男人多
关于美国的年收入
天真歌词(小曲儿)
问道手游守护五行阵容怎么搭配
有谁用过八杯水的防晒霜,我感觉涂了没什么感
议论文:骄傲要付出代价
香乐乡这个地址在什么地方,我要处理点事
我将蜂胶用水溶化,水中漂浮一层蜡,可以喝吗
辉达文体在什么地方啊,我要过去处理事情
请问大家新装修的房子4个月能不能住进去了
淘宝上有什么连衣裙好店适合学生穿的?
爱居兔合肥店
推荐资讯
Love私人定制我想知道这个在什么地方
广告公司缴纳业务保证金如何做帐,借方记什么
电脑主机吱的一声,电脑屏幕就未响应了,而且
能不能跳过校园网上网??
幼儿园教案《长大了我想》或者《我的梦想》教
已婚男女外遇,关生了男女关系,女方会不会纠
生长高峰期
请问什么叫来苏水?
干蕨菜,怎样才能泡才好吃
ACCESS 的修改语句如何写?
这种相亲是委婉的拒绝?
一瓶墨水重100克,( )瓶墨水重1千克。
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?