如何使用递归计算一组自然数的函数

时间:2015-03-28 17:53:30

标签: matlab recursion set computer-science dynamic-programming

我正在处理一组给定自然数的属性,似乎很难计算。我构建了一个函数'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

感谢。

1 个答案:

答案 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是内置函数,无需重新实现。