C#实现排列组合算法完整实例
程序员文章站
2023-12-20 21:52:10
排列组合是常见的数学问题,本文就以完整实例形式讲述了c#实现排列组合算法的方法。分享给大家供大家参考之用。具体方法如下:
首先,数学中排列组合,可表示为:排列p(n,r)...
排列组合是常见的数学问题,本文就以完整实例形式讲述了c#实现排列组合算法的方法。分享给大家供大家参考之用。具体方法如下:
首先,数学中排列组合,可表示为:排列p(n,r)
其实排列实现了,组合也就实现了,组合c(n,r)就是p(n,r)/p(r,r) ,实现这一功能比较简单的是递归算法,但考虑到递归的性能,下面采用了2种非递归的方法,具体代码如下
using system; using system.collections.generic; namespace test { class program { static void main(string[] args) { console.writeline(p1(6, 3)); console.writeline(p2(6, 3)); console.writeline(c(6, 2)); } /// <summary> /// 排列循环方法 /// </summary> /// <param name="n"></param> /// <param name="r"></param> /// <returns></returns> static long p1(int n, int r) { if (r > n || r <= 0 || n <= 0 ) throw new argumentexception("params invalid!"); long t = 1; int i = n; while (i!=n-r) { try { checked { t *= i; } } catch { throw new overflowexception("overflow happens!"); } --i; } return t; } /// <summary> /// 排列堆栈方法 /// </summary> /// <param name="n"></param> /// <param name="r"></param> /// <returns></returns> static long p2(int n, int r) { if (r > n || r <= 0 || n <= 0 ) throw new argumentexception("arguments invalid!"); stack<int> s = new stack<int>(); long irlt = 1; int t; s.push(n); while ((t = s.peek()) != n - r) { try { checked { irlt *= t; } } catch { throw new overflowexception("overflow happens!"); } s.pop(); s.push(t - 1); } return irlt; } /// <summary> /// 组合 /// </summary> /// <param name="n"></param> /// <param name="r"></param> /// <returns></returns> static long c(int n, int r) { return p1(n, r) / p1(r, r); } } }
希望本文所述对大家的c#程序设计有所帮助。