【问题标题】:C program to find the number of onto functions and to display all the functionsC 程序查找 on 函数的数量并显示所有函数
【发布时间】:2012-11-25 17:54:26
【问题描述】:

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

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

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

例如,如果 A = {1,2,3}, B={a,b,c},则从公式计算出的 on 函数数为 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 之间存在的每个函数。

【问题讨论】:

  • 不太清楚你在问什么。也许举一个很小的例子,展示你想要做什么,然后从那里开始?
  • 请记住,这里的人并不是都学过离散数学,甚至大多数人已经有一段时间了。您真的应该尝试用相当简单的术语来解释如何做事......
  • 给定两个集合 A 和 B,我需要找到并显示从 A 到 B 的每个函数。让我举个例子:A={1,2,3} B={a,b} number到函数的数量是 2^3-2=6。我需要以有序对的形式显示从 A 到 B 可以存在的所有 6 个函数。 f1={(1,a),(2,b),(3,b)} f2={(1,b),(2,a),(3,b)} f3={(1,b) ,(2,b),(3,a)} 等等。我需要编写一个 C 代码来显示所有这些功能。
  • 男人!除非集合很小,否则很快就会有很多功能。
  • 如果 f(A) = B 则调用函数 f:A->B,即如果所有 bEB 至少有一个 f(a) = b 的 aEA

标签: c algorithm recursion discrete-mathematics


【解决方案1】:

我前段时间回答了一个类似的问题,但 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 numbersi element of letters

    *---*---*---*               *---*---*---*                 *---*---*---* 
    | 1 | 2 | 3 |   -(Print)->  | 2 | 3 | 1 |    -(Print)->   | 3 | 1 | 2 |
    *---*---*---*               *---*---*---*                 *---*---*---*
    

所以你在这一点上得到:{(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,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 -> 4231(旋转和打印),交换 2 和 3 -> 4321(旋转和打印),交换 4 和 1 --> 1324(旋转和打印)。

我希望这会有所帮助。

【讨论】:

  • 回答作业问题而不发布代码粘贴会自动给你一个+1
猜你喜欢
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
相关资源
最近更新 更多