c#语言.输出从数组a中取n个数的所有排列(可以重复)
3个回答
展开全部
//题主没说明什么类型的数组作为输入,做了个泛型数组的例子
using System;
using System.Collections.Generic;
namespace ConsoleApplication1
{
class Program
{
private static void printArray<T>(IEnumerable<T[]> 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<T[]> GetPermutationN<T>(T[] sourceArray, int permutationLength)
{
foreach (var index in getPermutationIndex(sourceArray.Length, permutationLength))
{
var rtnRow = new List<T>();
foreach (var i in index)
rtnRow.Add(sourceArray[i]);
if (rtnRow.Count == permutationLength)
yield return rtnRow.ToArray();
}
}
/// <summary>
/// 获取arrayLenght长度数组的permLength长度的排列
/// 所使用的乘方式递归函数
/// </summary>
/// <param name="arrayLenght">
/// 样本元素数组的长度
/// </param>
/// <param name="permLength">
/// 从样本数组中取样的个数
/// </param>
/// <returns>
/// 返回样本元素数组下标矩阵
/// </returns>
private static IEnumerable<int[]> 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<int>();
rtnRow.Add(j);
rtnRow.AddRange(item);
yield return rtnRow.ToArray();
}
}
else
for (int j = 0; j < arrayLenght; j++)
yield return new int[] { j };
}
}
}
}
展开全部
因为可以重复,其实就是一个嵌套循环。
ArrayList li = new ArrayList();
li.AddRange(new int[]{1,2,3,4,5,6});
for (int i = 0; i < li.Count; i++)
{
for (int j = 1; j < li.Count; j++)
{
//在j循环里,拿li[i]这号元素和所有的其它元素拼接。
Console.WriteLine(li[i]+"、"+li[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 ();
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询