首页 > 解决方案 > 如何找到数字中设置的最后一位(SWI-Prolog)?

问题描述

我需要编写一段代码,其职责是计算给定数字中最后一位设置的位置。

这是我的尝试之一:

find_last_bit_set(Value, Result) :-
    do_find_last_bit_set(Value, -1, Result).
do_find_last_bit_set(0, R, R).
do_find_last_bit_set(Value, Result, R) :-
    Y #= Value // 2,
    Result1 is Result + 1,
    do_find_last_bit_set(Y, Result1, R).

然而问题是上面的代码永远不会停止。谁能告诉我我做错了什么?

标签: prolog

解决方案


在 的第一个子句成功之后do_find_last_bit_set/3,没有什么可以阻止引擎通过探索第二个子句来尝试进一步的解决方案,而第二个子句没有被防范Value为 0。

您可能希望添加一个守卫Value #\= 0作为第二个子句的第一个目标do_find_last_bit_set/3

do_find_last_bit_set(0, R, R).
do_find_last_bit_set(Value, Result, R) :-
    Value #\= 0,
    Y #= Value // 2,
    Result1 is Result + 1,
    do_find_last_bit_set(Y, Result1, R).

推荐阅读