我想计算给定范围内奇数的总和,如1到9是给定输入。并且我的程序将显示1到9之间所有奇数的总和。尽管这个任务非常简单,但作为turbo prolog的启动程序,我无法处理循环来计算求和。任何帮助都会升值..
预感谢。
答案 0 :(得分:0)
我不打算为你编写完整的解决方案,但可以提供一个如何以一般方式“循环”求和的想法。在Prolog中循环通常通过递归来完成。递归解决了这样一个事实:Prolog不会让你在实例化后在同一个谓词子句中重新实例化变量(除非你回溯)。以下是ISO Prolog语法。
nmap <Esc>[1;3D <C-w>h
nmap <Esc>[1;3B <C-w>j
nmap <Esc>[1;3A <C-w>k
nmap <Esc>[1;3C <C-w>l
第一个子句设置一个从值0开始的累加器。
第二个子句处理正常的递归情况,其中第一个值不超过最后一个。第一个值被添加到累加器以创建更新的累加器,并且“第一个”值递增以创建新的第一个值。对sum_values(First, Last, Sum) :-
sum_values(First, Last, 0, Sum).
sum_values(First, Last, Sum, Sum) :-
First > Last.
sum_values(First, Last, Acc, Sum) :-
First =< Last,
NewAcc is Acc + First,
NewFirst is First + 1,
sum_values(NewFirst, NewAcc, Sum).
的递归调用使用新累加器计算其余的和。
当第一个值最终超过最后一个值时,最后一个(第三个)子句将累加器的最终总和统一起来。
请注意,我可以在不引入累加器的情况下实现此功能,但是我不会拥有可以通过Prolog系统优化(如果需要)的尾递归。非累加器版本如下所示:
sum_values
这有点短,但没有可以重构的尾递归。
你需要为你的问题做的修改(这些是我所知道的,因为我对TP的一些语法只有一点熟悉):
sum_values(First, Last, 0) :- First > Last.
sum_values(First, Last, Sum) :-
First =< Last,
NewFirst is First + 1,
sum_values(NewFirst, Last, PartialSum),
Sum is PartialSum + First.
替换为is/2
(我认为TP使用=/2
进行表达式评估)=/2
替换为=<
(我不记得TP喜欢哪一个)<=
是否奇怪。如果不是,则需要跳过将其添加到累加器。您还可以对奇数First
进行初始检查,如果它不是奇数,则将其递增以形成新的First
,然后继续通过递归而不是递增2加总和