Prolog - 查找列表中元素的平均值

时间:2017-04-11 08:18:23

标签: prolog

有点偏离通常的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>

然而,这并没有产生正确的平均值。

2 个答案:

答案 0 :(得分:1)

你几乎是对的,问题是,当你的列表有一个元素时,它会调用courseAvg([], 0),它返回0,它将Mark+02分开,而它只需要返回{{} 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/2div(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.

这可以避免错误计算当前实现的单个元素的平均值。