我正在处理一组给定自然数的属性,似乎很难计算。我构建了一个函数'fun',它有两个输入,一个是基数值,另一个是集合。如果该集合为空,那么fun应该返回0,因为fun取决于集合的乘积以及补集集的所有子集的乐趣。
这里有一个例子:
S是给定S = {1,2,3,4}的集合。函数fun(2,S)定义为
fun(2,S)=prod({1,2})*[fun(1,{3}) + fun(1,{4}) + fun(2,{3,4})] +
prod({1,3})*[fun(1,{2}) + fun(1,{4}) + fun(2,{2,4})] +
prod({1,4})*[fun(1,{3}) + fun(1,{2}) + fun(2,{2,3})] +
prod({2,3})*[fun(1,{4}) + fun(1,{1}) + fun(2,{1,4})] +
prod({2,4})*[fun(1,{1}) + fun(1,{3}) + fun(2,{3,1})] +
prod({3,4})*[fun(1,{1}) + fun(1,{2}) + fun(2,{1,2})]
prod被定义为集合中所有元素的乘积,例如
prod({1,2})=2;
prod({3,2})=6
我正在尝试使用MATLAB中的递归方法计算函数的乐趣,但它不起作用。基本情况是基数值应该大于零,这意味着集合中应该至少有一个元素,其他方面prod将为零,而fun将返回零。
更新伪代码:
fun(i,S)
if |S|=1 && i!=0
return prod(S)
else if i==0
return 0
else
prod(subset s', s' is a subset of S and |s'|=i)*(sum over fun((for i=1 to m),{S-s'}), m=|S-s'|) //I don't know how to write code for this part and need help.
end if
end fun
prod(s)
n=|s|
temp=1
for i=1 to n
temp *=s(i) //s(1) is the 1st element of s
end for
return temp
end prod
感谢。
答案 0 :(得分:1)
使用伪代码添加到您的问题中,实现该功能几乎是不可能的。一切都被放入一行不完整(至少缺少外部总和)。
1)以可用于实现的方式形式化您的算法。以下伪代码可能不正确,因为我不完全知道你想要什么,但它应该知道如何去做。
fun(i,S)
if i==0
return 0
else if |S|=1
return S
else
r=0
for s1 in subsets of S with size i
f=0
for s2 in subsets of setdiff(S,s') with size <=i
f=f+fun(s2,|s2|)
end
r=r+prod(s1)*f
end for
end if
end fun
2)使用数组[1,2,3,4]
而不是单元格{1,2,3,4}
3)prod
是内置函数,无需重新实现。