C程序查找函数的数量并显示所有函数

时间:2012-11-25 17:54:27

标签: c algorithm recursion discrete-mathematics

我必须编写一个C程序(用于我的离散数学分配),它找到从集合A (|A| = m)到集合B (|B|=n)的函数数量,并显示所有这些函数。我使用代码计算的函数数量:

for(k=0; k<n; k++)
    x = x + pow( -1, k) * combination( n, n - k ) * pow( ( n - k ), m);

组合是一个找到可能组合数的函数。

例如,如果A = {1,2,3},B = {a,b,c},则根据公式计算的函数数量为 3 ^ 3 - 3(2 ^ 3)+ 3 = 6。 一种可能的解决方案是f = {(1,a),(2,b),(3,c)} [我知道这是一个解决方案]。

但我的问题是:如何显示每一个解决方案!? 这只是一个微不足道的例子。但是如果m和n值增加(假设m> = n)那么可能的函数数量呈指数增长! 例如,如果m = 7且n = 4,则有8400个函数!

我想不出任何方法来显示A和B之间存在的每一个函数。

1 个答案:

答案 0 :(得分:4)

我前一段时间回答过类似的问题,但是m和n相等m = n。(你必须递归思考才能解决这个问题),你的评论我觉得可能的答案是:{(1,a)(2,b)(3,c)}, {(2,a)(3,b)(1,c)}, {(3,a)(1,b)(2,c)}, {(3,a)(2,b)(1,c)}, {(2,a)(1,b)(3,c)} and {(1,a)(3,b)(2,c)}那么这是我的食谱:

  1. 设置2个数组及其初始值,让我们称之为lettersnumbers

    *---*---*---*                          *---*---*---*
    | a | b | c | <---letters.             | 1 | 2 | 3 | <---numbers.
    *---*---*---*                          *---*---*---*
    
  2. 选择其中一个阵列作为您的支点,我选择letters,它将是静态的。

    *---*---*---*                          *---*---*---*
    | a | b | c | <---STATIC.              | 1 | 2 | 3 | <---DYNAMIC.
    *---*---*---*                          *---*---*---*
    
  3. 根据需要逆时针或顺时针旋转动态阵列,必须使用i element of numbers打印i element of letters

    *---*---*---*               *---*---*---*                 *---*---*---* 
    | 1 | 2 | 3 |   -(Print)->  | 2 | 3 | 1 |    -(Print)->   | 3 | 1 | 2 |
    *---*---*---*               *---*---*---*                 *---*---*---*
    
  4. 所以你明白了这一点:{(1,a)(2,b)(3,c)}, {(2,a)(3,b)(1,c)}, {(3,a)(1,b)(2,c)},3缺失。

    1. i element与动态数组的n element交换。

      *---*---*---*                                     *---*---*---*
      | 1 | 2 | 3 |   ---------( Swap (0<->2) )-------> | 3 | 2 | 1 | 
      *---*---*---*                                     *---*---*---*
      
    2. 重复步骤3.

      *---*---*---*               *---*---*---*                 *---*---*---* 
      | 3 | 2 | 1 |   -(Print)->  | 2 | 1 | 3 |    -(Print)->   | 1 | 3 | 2 |
      *---*---*---*               *---*---*---*                 *---*---*---*
      
    3. 所以你得到了错过的子集:{(3,a)(2,b)(1,c)}, {(2,a)(1,b)(3,c)} and {(1,a)(3,b)(2,c)}

      如果您有超过3个示例4.简单:1234(旋转N次,其中N是变量的数量,并在每次移动时打印),交换1和4 - &gt; 4231(轮换和打印),交换2和3 - &gt; 4321(轮换和打印),交换4和1 - &gt; 1324(轮播和打印)。

      我希望这会有所帮助。