我试图以表格形式获得输出:
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).
答案 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 -
由你来填补空白。祝你好运!