如何使用递归计算一组自然数的函数
How to compute a function on a set of natural numbers using recursion
我正在研究一组给定自然数的 属性,它似乎很难计算。我构建了一个函数 'fun',它接受两个输入,一个是基数值,另一个是集合。如果集合为空,则 fun 应该 return 0,因为 fun 取决于集合的乘积,而 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 中使用递归方法计算函数 fun 但它不起作用。基本情况是基数值应该大于零,这意味着集合中应该至少有一个元素,否则 prod 将为零并且 fun 将 return 为零。
更新伪代码:
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
谢谢。
使用您添加到问题中的伪代码,几乎不可能实现该功能。所有内容都放在一行中,但不完整(至少缺少外部总和)。
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
为内置函数,无需重新实现
我正在研究一组给定自然数的 属性,它似乎很难计算。我构建了一个函数 'fun',它接受两个输入,一个是基数值,另一个是集合。如果集合为空,则 fun 应该 return 0,因为 fun 取决于集合的乘积,而 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 中使用递归方法计算函数 fun 但它不起作用。基本情况是基数值应该大于零,这意味着集合中应该至少有一个元素,否则 prod 将为零并且 fun 将 return 为零。
更新伪代码:
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
谢谢。
使用您添加到问题中的伪代码,几乎不可能实现该功能。所有内容都放在一行中,但不完整(至少缺少外部总和)。
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
为内置函数,无需重新实现