我有一个让我疯狂的问题! 我想用他们的身份来计算一些学生的平均成绩。我编写了下面的代码,但它在第一次计算后堆叠:
list_sum([], 0).
list_sum([Head | Tail], TotalSum) :-
list_sum(Tail, Sum1),TotalSum is Head + Sum1.
find_student_avg(Student,Year,Avg):-
findall(X, grades(_,student(id(Student),_,_,_,_,_),year(Year),normal(X)), L),
%% not(resit_grades(_,student(id(Student),_,_,_,_,_),_,_)),
list_sum(L,Sum),
length(L,N), N>0,
Avg is Sum / N.
find_all_avgs([Head|Tail],Year,L):-
find_student_avg(Head,Year,Avg),append(L1,[Head|Avg],L),find_all_avgs(Tail,Year,L2).
我的结果需要L=[[id1|avg1],[id2|avg2],[id3|avg3]]
。有人可以帮忙?????
Pleaseeeee !!!!
有关如何按平均排序此列表的想法吗?
答案 0 :(得分:1)
考虑将find_all_avgs / 3重写为典型的递归谓词(Base case + recursive step) 基本情况是第一个参数(学生列表)是一个空列表。在这种情况下,结果也是一个空列表。 递归步骤clasuse将采用输入列表的头部,计算该学生的学生平均值,然后计算其余的平均值(递归)。请注意,计算出的平均值可以作为输出列表的头部而不是使用append / 3。
因此,结果谓词将是:
find_all_avgs([],_,[]). % Base case
find_all_avgs([Head|Tail],Year,[[Head,Avg]|L]):-
find_student_avg(Head,Year,Avg),
find_all_avgs(Tail,Year,L). % Recursion step
此谓词产生的形式为L = [[Student1,Average1],....,[StudentN,AverageN]],这与您所述的不同。但是,我相信这将是正确的输出格式。
如果你真的需要其他输出格式,那么第二个子句的头部应该是
find_all_avgs([Head|Tail],Year,[[Head|Avg]|L]):-