【发布时间】:2023-03-28 06:59:01
【问题描述】:
这就是我试图将八进制数转换为二进制数的方法。 我想做的是找到给定八进制数除以 10 的余数,得到每个数字并将该数字转换为 3 位二进制。但是这段代码没有产生任何输出。请帮助解决这个问题。 提前致谢。
convert_bin(0, '0').
convert_bin(1, '1').
convert_bin(N, B) :-
N > 1,
X is N mod 2,
Y is N // 2,
convert_bin(Y, B1),
atom_concat(B1, X, B).
convert_oct(N, O) :-
X is N mod 10,
convert_bin(X, B),
Y is N // 10,
convert_oct(Y, O1),
atom_concat(O1, B, O).
【问题讨论】:
-
离题:N 是八进制,必须使用 8 作为底数,而不是 10
-
我非常清楚这一点。但是要将八进制转换为二进制,您只需将每个数字转换为 3 位的二进制数。示例八进制数 123 是 001010011。所以要做到这一点,123 mod 10 给出 3。3 的二进制是 011。然后 123/10 是 12。12 mod 10 是 2,2 的二进制是 010。最后 12/10 是 1和 1 mod 10 是 1,它的二进制是 001。很明显,这就是我在这段代码中所做的,你可能错过了理解。
-
您不一致的表述更加混乱。实际上,正如 Prolog 所理解的那样,您正在处理一个十进制数,就好像它是八进制一样,但是您的输出是一个表示二进制的原子,而不是像使用八进制输入那样使用十进制数来表示二进制。无论如何,我看到的一个问题是您没有
convert_oct/2的基本案例。至少如果你这样做了,你还没有表现出来。没有基本情况,它必然会失败而没有结果。 -
我是 prolog 的新手。你能告诉我如何让代码在这种情况下工作吗?只需为 convert_oct 添加一个基本案例就能得到正确的结果?
-
为什么不添加一个好的基本案例并找出答案? :) 查看您的
convert_oct/2谓词并弄清楚递归将如何结束。在什么条件下会这样?