Recursion 如何在GAMS中递归定义参数?

Recursion 如何在GAMS中递归定义参数?,recursion,gams-math,Recursion,Gams Math,我需要定义一组具有自然递归关系的参数 这里是一个MWE,我试图在一组(九个)参数S上定义阶乘函数: $title TitleOfProblem set S / s1*s9 /; alias(S, S1, S2); set delta1(S1,S2); delta1(S1,S2) = yes$(ord(S1) + 1 = ord(S2)); parameter f(S); f(S) = 1$(ord(S) = 1) + (ord(S) * sum(S1$(delta1(S1, S)),

我需要定义一组具有自然递归关系的参数

这里是一个MWE,我试图在一组(九个)参数S上定义阶乘函数:

$title TitleOfProblem

set S / s1*s9 /;

alias(S, S1, S2);

set delta1(S1,S2);
delta1(S1,S2) = yes$(ord(S1) + 1 = ord(S2));

parameter f(S);

f(S) = 1$(ord(S) = 1) + (ord(S) * sum(S1$(delta1(S1, S)), f(S1)))$(ord(S) > 1);

display f;
“delta1”是一种关系,包含按排序顺序排列的元素对,它们的差值为1。逻辑上,f的定义与阶乘函数的定义相匹配(对于输入1到9),但GAMS似乎不喜欢f是递归定义的。GAMS编译的输出如下所示:

f(S) = 1$(ord(S) = 1) + (ord(S) * sum(S1$(delta1(S1, S)), f(S1)))$(ord(S) > 1);
                                                          $141

141  Symbol neither initialized nor assigned
    A wild shot: You may have spurious commas in the explanatory
    text of a declaration. Check symbol reference list.
问题: 可以在GAMS中递归定义参数吗?如果不是,什么是工作环境


(注意,有足够代表性的人应该创建一个标记“GAMS”并将其添加到此问题中。)

有人向我展示了一个使用while循环的示例解决方案。然而,这个解决方案是特定于阶乘的,并且不能推广到任意递归函数

$title factorial

set S / s1*s9 /;

parameter f(S);
parameter temp;

Loop(S,
  temp=ord(s);
  f(S)=ord(s);
    While(temp > 1,
      f(S) = f(S) * (temp-1);
      temp = temp - 1;
    );
);

display f;