【问题标题】:Adding two lists representing numbers in prolog在序言中添加两个表示数字的列表
【发布时间】:2016-11-21 03:50:57
【问题描述】:

任务说:数字由列表表示(例如 123 = [1, 2, 3]),编写一个谓词,将两个这样的数字相加。 (例如sum([4, 5, 6], [9], [4, 6, 5]))。

我一直在考虑如何递归地表达这一点,但让我感到困惑的是当数组的大小发生变化时。看起来,如果数组被还原,这将很简单,因此 HEAD 实际上是最后一个元素。因为对我来说问题是我的总和看起来像这样:

  [4, 5, 6]
+
  [9]

而不是

  [4, 5, 6]
+
        [9]

写这样的谓词的正确方法是什么?我需要一些指针或参考以寻求帮助...

【问题讨论】:

    标签: prolog


    【解决方案1】:

    这是我的实现:

    sum(L1,L2,OutL):-
             reverse(L1,List1),reverse(L2,List2),
             add_lists(List1,List2,0,List3),
             reverse(List3,OutL).
    
    add_lists([],[],0,[]).
    add_lists([],[],1,[1]).
    add_lists([],[H|T],C,[H1|T]):-H1 is H+C.
    add_lists([H|T],[],C,[H1|T]):-H1 is H+C.
    add_lists([H|T],[H1|T1],C,[H2|T2]):-NH is H1+H,
                             (NH > 10 -> NC is 1,H2 is NH+C-10; H2 is NH+C,NC is 0),
                              add_lists(T,T1,NC,T2).
    

    我们的想法是颠倒列表以添加正确的位置并避免您提到的问题。此外,如果加法大于 10,则您只需保留 1 的进位,而您减少 10。

    例子:

    ?- sum([4, 5, 6], [9], L).
    L = [4, 6, 5] ;
    false.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      相关资源
      最近更新 更多