【问题标题】:Rewrite the definition in order to avoid the recursive call重写定义以避免递归调用
【发布时间】:2022-01-08 23:25:34
【问题描述】:

给定以下 PROLOG 谓词定义 f(integer, integer),具有流模型 (i, o):

f(0, -1) :- !.
f(I,Y):-
  J is I-1,
  f(J,V),
  V > 0,
  !,
  K is J,
  Y is K+V.
f(I,Y):-
  J is I-1,
  f(J,V),
  Y is V+I.

重写定义以避免在两个子句中递归调用 f(J,V)。不要重新定义 谓词。证明你的答案

【问题讨论】:

  • 您的尝试达到了多少?你知道谓词f 描述了什么吗?这可能是第一步。
  • 你试过运行它看看输出是什么吗?然后,您可以将输出反向工程回代码,而不是整天盯着代码在脑海中尝试。
  • 这是我考试的练习题,考试期间我不能用电脑解决这类练习题。
  • 然后制作输入值表,手动运行代码并记录输出。这将使您对代码的作用有所了解。这显然是为了在心理上难以跟踪而写的。还要给变量名一些更有意义的东西,比如 count_down、count_up、increment、counter、halt_value 等。
  • 可惜你不能使用 OEIS。 (ref)

标签: prolog


【解决方案1】:

灵感来自question:

ffast(0, -1) :- !.
ffast(1, 0) :- !.
ffast(2, 2) :- !.
ffast(X, Y) :-
    X0 is X - 1,
    ffast(X0, Y0),
    Y is Y0 + X0.

...然后到:

ffast2(0, Y) :- !, Y = -1.
ffast2(1, Y) :- !, Y = 0.
ffast2(X, Y) :- Y is ((X * (X - 1)) / 2) + 1.

(根据最佳实践,防止 Y 成为输入。)

【讨论】:

  • 我使用了在 OEIS 上找到的 N is N0 - 1, R is (N * (N + 1) / 2) + 1
猜你喜欢
  • 1970-01-01
  • 2020-05-28
  • 2021-09-20
  • 1970-01-01
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
相关资源
最近更新 更多