prolog - 如何找到数字中设置的最后一位(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).
然而问题是上面的代码永远不会停止。谁能告诉我我做错了什么?
解决方案
在 的第一个子句成功之后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).
推荐阅读
- elasticsearch - 了解弹性搜索中嵌套字段的排序结果
- linux - 如何在 sh 中循环到日期之间的月末日期?
- typescript - 如何画一个圆形的图片 Pixijs
- docker - 在运行的容器内挂载 Lustre 不起作用(已添加所有功能)
- java - 无法从 docker 容器在 Wildfly 服务器 bin 文件夹中创建日志文件夹
- reactjs - 从组件内部和外部更改属性或状态
- data-structures - 什么是存储和使用同义词库的好数据结构?
- c++ - c++ 有没有可能`map.end()` 可以在`std::map` 的生命周期内改变
- string - 用于将字符串“09-Jan-20”//(DD-MMM-YY)转换为 ISO 日期的 MongoDB 脚本
- c# - 自动填充代理要求 webview2