0

我想在序言中创建一个包含嵌套结构系数的列表。

例如:(structure--> 返回值)

item(koeffizient(2), exponent(2), item(koeffizient(3), exponent(3)))--> [0,0,2,3]

item(koeffizient(5), exponent(0), item(koeffizient(1), exponent(1), item(koeffizient(3), exponent(3))))--> [5,1,0,3]

item(koeffizient(5), exponent(0))--> [5]

item(koeffizient(5), exponent(0), item(koeffizient(2), exponent(2)))--> [5,0,2]

我怎样才能以递归方式做到这一点?其实我不知道我怎么能做到这一点。

谢谢你能给我的任何帮助=)

4

1 回答 1

0

首先请注意,按照定义的方式使用递归结构并不是一个好主意,因为它将最后一项与其他项区分开来。

假设您的结构按指数排序(如您的示例所示),您可以贪婪地做到这一点:

structure(Struct, Exps):-
  structure(Struct, 0, Exps).

structure(item(koeffizient(Coeff), exponent(Exp)), Exp, [Coeff]).
structure(item(koeffizient(Coeff), exponent(MExp)), Exp, [0|Tail]):-
  MExp > Exp,
  succ(Exp, NExp),
  structure(item(koeffizient(Coeff), exponent(MExp)), NExp, Tail).
structure(item(koeffizient(Coeff), exponent(Exp), StructTail), Exp, [Coeff|Tail]):-
  succ(Exp, NExp),
  structure(StructTail, NExp, Tail).
structure(item(koeffizient(Coeff), exponent(MExp), StructTail), Exp, [0|Tail]):-
  MExp > Exp,
  succ(Exp, NExp),
  structure(item(koeffizient(Coeff), exponent(MExp), StructTail), NExp, Tail).

过程只是用指数 0structure/2调用。structure/3

的第一个子句structure/3是基本情况。它返回最后一个指数的系数。

当当前指数不匹配时,第二个子句匹配基本情况。所以在这种情况下,我们返回一个零作为下一个系数,增加当前指数并应用递归。

当当前指数与结构的当前指数匹配时,第三个子句匹配递归情况。所以它返回相应的系数,增加当前指数并再次应用递归。

最后一个子句类似于第二个子句,但适用于仍然有更多项目的输入结构(除了当前的)。

如果,正如您的评论所说,输入没有排序,那么最好将您的输入转换为 Exp-Coeff 形式的有序元组列表。

使用这样的列表,您的structure/2程序保持不变,您可以简化procedure/3为:

structure([], _, []).
structure([Exp-Coeff|Tail], Exp, [Coeff|TailCoeffs]):-
  succ(Exp, NExp),
  structure(Tail, NExp, TailCoeffs).
structure([MExp-Coeff|Tail], Exp, [0|TailCoeffs]):-
  MExp > Exp,
  succ(Exp, NExp),
  structure([MExp-Coeff|Tail], NExp, TailCoeffs).
于 2012-12-07T14:08:56.573 回答