首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog中带有条件的递归求和

Prolog中带有条件的递归求和
EN

Stack Overflow用户
提问于 2020-04-12 02:26:50
回答 2查看 118关注 0票数 0

我被要求在Prolog中执行一个程序,该程序必须能够用递归结构对偶数和奇数进行求和。该规则的形式如下:

代码语言:javascript
复制
sum(N,PairSum,OddSum)

以N作为给定的数作为参数。例如:如果是N=5,那么PairSum=4+2和OddSum=5+3+1

我的代码如下

代码语言:javascript
复制
suma(0,0,0).
suma(N,SumPares,SumImpares) :-
   N>0,
   N1 is N -1,
   suma(N1,SumaP,SumaI),
   (  (0 is mod(N,2))
   -> SumPares is SumaP + (N-2)
   ;  SumImpares is SumaI +(N-2)
   ).

代码编译成功,当我运行它时,它会失败。例如,使用N=5

suma(5,SumaPares,SumaImpares)

我得到以下信息

错误:参数没有充分实例化错误: In: ERROR:

12 _9750为_9756+(2-2)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-16 13:27:38

在遵循@gusbro的建议并注入其他一些建议之后,我可以对这段代码进行适当的工作。键在基情况下是suma(2,2,1),而不是suma(0,0,0)。另一个问题是我在if子句中的求和是一个do N-2,我只需要把N放在一边,而不做任何减法。以下是工作代码:

代码语言:javascript
复制
 suma(2,2,1).
 suma(N,SumaPares,SumaImpares) :-
       N>0,
       N1 is N -1,
       suma(N1,SumaP,SumaI),
       ( 0 is mod(N,2) ->
            (SumaPares is SumaP + N, SumaImpares is SumaI)
         ;  (SumaImpares is SumaI +N, SumaPares is SumaP)
       ).

非常感谢你的帮助。

票数 0
EN

Stack Overflow用户

发布于 2020-04-12 04:43:31

在查阅此代码时,您应该会看到两个单例警告:SumaISumI只在过程summation/3的第二个子句正文中出现一次。

查看您的代码,您似乎希望使用相同的变量,因此将SumaI重命名为SumI。现在,在重新查看代码之后,您应该不会看到任何单例警告。

澄清后编辑

编辑之后,仍然有单例警告。除了键入之外,问题是您的条件分支分配了一个和变量,并保留了另一个变量。我相信你想要这样的东西:

代码语言:javascript
复制
suma(0,0,0).
suma(N,SumaPares,SumaImpares) :-
   N>0,
   N1 is N -1,
   suma(N1,SumaP,SumaI),
   ( 0 is mod(N,2) -> 
        (SumaPares is SumaP + (N-2), SumaImpares=SumaI)
     ;  (SumaImpares is SumaI +(N-2), SumaPares=SumaP)
   ).
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61166114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档