将多个2元素列表添加到1个列表

时间:2016-03-21 02:29:58

标签: prolog

我试图以表格形式获得输出:

Result = [[5,2.23607], [4,2.0], [3,1.7321]] ;

该程序的想法是输入两个数字,N和M.

N总是大于M.

程序找到从N到M(包括)的数字的平方根。

以上Result将是函数sqrt_finder(5,3,Result)的结果。

我一直试图弄清楚如何做到这一点,但不了解递归追加过程。

即使我确实这样做了,我也不认为输出会采用我需要的格式。

这是我到目前为止所做的。

sqrt_finder(N,M,Result) :-
   N is M,
   Y is sqrt(N),
   Result = [N,Y].
sqrt_finder(N,M,Result) :-
   X is N-1,
   Y is sqrt(N),
   append([N,Y],sqrt_finder(X,M,Result),Result).

任何人都可以帮助解释appending流程以及变量Result如何影响这一过程吗?

感谢您的帮助。

更新

sqrt_finder(N,N,[[N,Y]]) :-
   Y is sqrt(N).
sqrt_finder(N,M,[[N,Y]|Result]) :-
   N > M, 
   X is N-1,
   Y is sqrt(N),
   sqrt_finder(X,M,Result).

1 个答案:

答案 0 :(得分:0)

让我们尝试将其细分为您在问题中指定的内容(不是说这是最优雅的解决方案,只是为了保持简单):

  

该程序的想法是输入两个数字,N和M,其中N总是大于M.

main(N,M,Result) :-
    N > M,
    calc_roots(N,M,Result).
  

程序找到从N到M(包括)的数字的平方根。

我猜这是一个任务,他们现在要求将M包括在你的计算中的事实是让它变得有点困难,因为第一个条件是N应该总是大于M.再次,那里有几种方法可以实现这一目标,但我们将采用简单的方法。

我们写下可能的状态:

-N小于M,这是无效条件我们的终止条件,当减少N来计算从N到M的所有平方根时,我们必须在这里停止执行。

-N大于或等于M,在这种情况下,我们需要N的平方根并将其减1,以递归方式保持相同,直到我们达到上面定义的基本情况。

% Base case
calc_roots(N,M,[]) :- N < M.

% N is greater than or equal to M (we need M inclusive)
calc_roots(N,M,[[N,Sqrt]|Result]) :-
    N >= M,
    - calc square root -
    - decrease N -
    - make recursive call with new N -

由你来填补空白。祝你好运!