我有以下计算区域的功能。
它接收三个参数,第一个是表示案例数的n,第二个表示周长的无线电,第三个是l给我的结果。
我遇到的问题是,当第一个输入大于1时,它不起作用。
这是我的代码:
as(1, [X], A) :-
A is (sqrt(3.0) * (X*X)) - (3.14 * (X*X))/2.
as(N, [H|_T], A) :-
A is (sqrt(3.0) * (H*H)) - (3.14 * (H*H))/2,
N1 is N-1,
as(N1-1, T, A).
它应该如何运作的一个例子是:
?- as(4, [1,1,1,1], R).
R = 0.162050807568877130000 ;
R = 0.162050807568877130000 ;
R = 0.162050807568877130000 ;
R = 0.162050807568877130000.
如果你能帮助我,我将不胜感激......
答案 0 :(得分:3)
这个版本不足以满足您的需求吗?
<?php
$lines= array(1, 2, 3, 4, 5);
function lineOne($line){
if($line == null ){ $line = 1; }
if( in_array($line, $lines) ){
$line = rand(6, 10);
lineOne($line);
break;
}
echo $line;
}
lineOne();
?>
或许这个?
as([H|_], A):-
A is (sqrt(3.0) * (H*H)) - (3.14 * (H*H))/2.
as([_|T], A) :- as(T, A).
area(H, Area) :-
Area is (sqrt(3.0) * (H*H)) - (3.14 * (H*H))/2.
as(List, Area) :- member(Ratio, List), area(Ratio, Area).
。N
和N
会导致冗余。你不应该重复你的公式。[X]
,然后身体里的_T
无效。T
传递给递归调用,这不会导致它被评估 - 但您已经在前一个表达式中评估了N1-1
,因此请在此处传递N-1
。同样,我根本没有看到这一点。N1
而不是添加或减去一个是个好主意,因为它适用于两个方向(当然在这里不相关)。答案 1 :(得分:2)
既然你想计算每次测量的面积,那么获得与无线电测量列表相对应的区域列表是不合适的呢?你的谓词结构为/ 3似乎表明你正在思考这些问题。您可以使用maplist / 3轻松实现这一目标:
:- use_module(library(apply)). % needed for maplist
% a single measurement and the corresponding area
area(X, A) :-
A is (sqrt(3.0) * (X*X)) - (3.14 * (X*X))/2.
areas(Xs,As) :-
maplist(area,Xs,As). % area/2 mapped to Xs results in As
查询此谓词会产生所需的结果,但在列表中:
?- areas([1,1,5,3],As).
As = [0.16205080756887713, 0.16205080756887713, 4.051270189221931, 1.4584572681198935].