代码之家  ›  专栏  ›  技术社区  ›  Matt

递归追加列表

  •  0
  • Matt  · 技术社区  · 15 年前

    这是一个片段:

    translate("a", "4").
    translate("m", "/\\/\\").
    
    tol33t([], []).
    tol33t([Upper|UpperTail], [Lower|LowerTail]) :-
        translate([Upper], [Lower]),
        tol33t(UpperTail, LowerTail).
    

    基本上我想做的是在表格中查找一封信,然后把它添加到新的列表中。

    输入示例:

    l33t(“曾经”,L)。 它会这样穿: l33t([119,97115],左)。

    [92,47,92,47]++[52]++[53]或[92,47,92,47,52,53]

    1 回复  |  直到 15 年前
        1
  •  3
  •   user206428 user206428    15 年前

    考虑这些修改 tol33t/2 :

    tol33t([], []).
    tol33t([Code|Codes], Remainder) :-
        translate([Code], Translation), !,
        tol33t(Codes, Rest),
        append(Translation, Rest, Remainder).
    tol33t([Code|Codes], [Code|Remainder]) :-
        tol33t(Codes, Remainder).
    

    第一条是基本情况。

    Code 通过 translate/2 Translation -你的笔记 [Lower] ! )在检查代码翻译之后,提交查找 Rest 翻译 在前面,作为 Remainder 回来。

    如果当前没有翻译,则执行第三条 代码 (即 )在第二句中。在这种情况下,没有 代码

    编辑:

    !

    tol33t([Code|Codes], Remainder) :-
        tol33t(Codes, Rest),
        (translate([Code], Translation) ->            
            append(Translation, Rest, Remainder)
        ;   Remainder = [Code|Rest]
        ).
    

    这个(未优化的)版本检查 在角色列表中, 如果 翻译/2 成功了;如果是的话 附加到 休息 其他的 代码 是不变的。请注意,这与上面的实现具有相同的语义,因为解决方案被提交给(即,模拟切割 ! )如果 -> ( 翻译/2 代码 如果存在适用的 翻译/2

    推荐文章