有点偏离通常的Prolog-find平均值,但我有以下代码:
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title> Birthday </title>
<?php
if(isset($_POST["birthday"]))
$birthday = $_POST["birthday"];
else
$birthday = 1;
function calculate_age($birthday){
list($day, $month , $year) = explode("/", $birthday);
$day_diff = date("d") - $day;
$month_diff = date("m") - $month;
$year_diff = date("Y") - $year;
if($month_diff < 0){
$year_diff--;
}
else if(($month_diff == 0) && ($day_diff < 0)){
$year_diff--;
}
else if (($month_diff == 0) && ($day_diff == 0)){
echo "<script type='text/javascript'>alert('Happy
Birthday!!!');</script>";
}
return $year_diff;
}
$finalBirthday=calculate_age($birthday);
?>
</head>
<body>
<h1>Birthday Calculator</h1>
<form name="Birthday" method="POST" action="birthday.php">
<label>What is your Birthday?</br></label>
<input type ="text" name = "birthday" VALUE = "DD/MM/YYYY"></br>
<input type ="submit" name = "submit" VALUE = "Submit"></br>
</form>
<?php
echo "Our Birthday Calculator says you are " .$finalBirthday;
?>
</body>
</html>
然而,这并没有产生正确的平均值。
答案 0 :(得分:1)
你几乎是对的,问题是,当你的列表有一个元素时,它会调用courseAvg([], 0)
,它返回0,它将Mark+0
与2
分开,而它只需要返回{{} 1}}。
添加if条件:
Mark
(或者你可以将一个元素返回标记的列表作为基本情况)。 例如:
courseAvg([], 0).
courseAvg([_+_+Mark|Tail], Avg) :-
courseAvg(Tail, Number),
( Number =\= 0 ->
Temp is Number + Mark,
Avg is div(Temp,2);
Avg is Mark ).
正如您在上面所看到的,它只返回整数,因为您使用?- courseAvg([9,9,9],N).
N = 9.
?- courseAvg([9,9,8],N).
N = 8.
。如果您希望avg为浮点替换:div/2
与div(Temp,2)
:
/(Temp,2)
答案 1 :(得分:1)
空列表实际上没有平均值,因为计算将是未定义的(它将是0/0,因为有0个元素)。我会将基本情况设为单个元素,这是具有平均值的最小列表,并且让递归案例处理至少2个元素:
courseAvg([_+_+Mark], Mark).
courseAvg([_+_+Mark, Next|Tail], Avg) :-
courseAvg([Next|Tail], Number),
Temp is Number + Mark,
Avg is Temp/2.
这可以避免错误计算当前实现的单个元素的平均值。