是否可以通过函数表达任意随机数组?
问题澄清:
例如: 如果需要,结果集= {1,2,3,4,5}
所以我的意思不是这样的:
function getSet(){
return {1,2,3,4,5};
}
但更像是这样:
function genSet(){
result = {}
for(i=0;i<5;i++){
result.push(i);
}
return result;
}
换句话说,是否有逻辑来计算任何所需的集合?
答案 0 :(得分:1)
编程时有两种常用的表示形式。假设集合S是某些项目U的子集。
表示集合S的一种方法是从S到{true,false}的函数member
。对于U中的所有x:
member(x) = true
如果x在S member(x) = false
如果x不在S bool member(int n)
return 1 <= n <= 5
表示S的另一种方法是将其所有成员存储在数据结构中,例如列表,哈希表或二叉树。
enumerable<int> S()
for int i = 1 to 5
yield return i
使用这些表示中的任何一个,都可以定义大多数设置操作。例如,对于两个表示中的每一个,两个集合的并集看起来如下。
func<int, bool> union(func<int, bool> s, func<int, bool> t)
return x => s(x) || t(x)
enumrable<int> union(enumerable<int> s, enumerable<int> t)
hashset<int> r
foreach x in s
r.add(x)
foreach x in t
if x not in r
r.add(x)
return r
成员谓词表示可以是非常通用的,因为可以非常容易地表达来自数学的各种集合运算(补充,笛卡尔积等)。缺点是没有通用的方法来枚举以这种方式表示的集合的所有成员。例如,所有正实数的集合甚至无法枚举。
枚举表示通常涉及更昂贵的集合操作,并且甚至不能表示某些操作(例如整数集{1,2,3,4,5}的补集)。如果您需要能够枚举集合的成员,而不仅仅是测试成员资格,则应该选择它。
答案 1 :(得分:1)
这个问题背后有很多数学。有一些有趣的结果。
任何一组(实数)都可以通过多项式函数f(x)= a + bx + cx ^ 2 + ... 定义,这样如果f中有一个数字在集合中(X)= 0。从技术上讲,这是1D中的代数曲线。虽然这似乎是乐观的结果,但多项式的复杂程度并没有限制,5级以上的多项式没有明确的结果。
在Computable numbers上有一个完整的研究领域,实数可以通过有限的终止算法在任何所需的精度内计算,并且它们相反:不可计算的数字,这不可能。坏消息是,与可计算的数字相比,有更多不可计算的数字。
以上是基于实数的,这些实数比整数或甚至是有限的整数集更加棘手,我们可以通过int
或long
数据类型来表示这些整数。这里有一个很大的研究领域,见Computability theory (computer science)。我认为Turings暂停问题可以发挥作用,这是关于你是否可以确定算法是否会终止。不幸的是,这不能确定,结果是&#34;并非每一组自然数都是可计算的。&#34;证明这确实需要无限大小的自然因此我不确定有限集。