List 序言作业:如何解析';位';将数值表示为十进制表示?

List 序言作业:如何解析';位';将数值表示为十进制表示?,list,binary,prolog,List,Binary,Prolog,好的,我还有一个关于序言作业的问题,我正在努力解决。问题如下: 编写一个Prolog程序,它将获取一个表示二进制数位的列表,并返回该列表所表示的整数的十进制值 示例:valueof([1,1,0,1],X)。 X=13 以下是我到目前为止的情况: valueOf(List, X) :- setup(List, [], X). setup([H|T], [Y|H], X) :- setup(T,Y,X). setup([], Y, X) :- count(Y, X, 0). count([], _

好的,我还有一个关于序言作业的问题,我正在努力解决。问题如下:

编写一个Prolog程序,它将获取一个表示二进制数位的列表,并返回该列表所表示的整数的十进制值

示例:valueof([1,1,0,1],X)。 X=13

以下是我到目前为止的情况:

valueOf(List, X) :- setup(List, [], X).
setup([H|T], [Y|H], X) :- setup(T,Y,X).
setup([], Y, X) :- count(Y, X, 0).
count([], _, _).
count([H|T], X, Count) :- NewCount is Count + 1, NewX is X + (H*2^Count),
                          count(T,NewX,NewCount).

再一次,我感谢所有的帮助,我似乎真的在为这段序言挣扎。谢谢。

你的算法看起来太复杂了;试着做以下几点:

  • 基本情况:一位数字列表,返回数字
  • 递归大小写:返回最后一个数字加上删除最后一个数字后列表结果的2倍

因为这是一个家庭作业,所以我将把实现细节留给您。

我不同意Carl对基本案例的选择。我们必须处理空列表的情况,最好不要有多种类型的“基本情况”。类似于“基本情况”的情况是递归的“底部”的情况,我们都知道事情只有一个底部,或者说基本情况

因此,我建议:

  • 基本情况:
    • 空列表,其值为“零”(0)
    • 本例结束递归,因此必须将任何累积值复制到输出参数中
  • 初始情况:尚未累积任何数字,累加器变量将为零(0)
  • 递归情况:每次递归中检查的数字累加到累加器中
序言代码如下所示:

% Initial value of accumulator is zero (0).
valueOf( L, X) :- value_of_accumulation( L, 0, X).

% Base case:
% When there are no more digits to process, the output value (3rd param)
% is unified with the accumulator (2nd param)
value_of_accumulation( [], A, A).

% The recursive step.  There is a digit (B) to process here.  T is a temporary
% which holds the value of the accumulator "passed down" to the next case
% and, ultimately, to the base case after possible more accumulations.  A holds
% the previously-accumulated value derived from more-significant bits, already
% processed in previous recursions.  This clause is invoked once for each bit.
% Implicitly, the invocations of this clause generate a "count" but there is no
% actual use of the count when accumulating the bits.  Each bit is accumulated
% without knowledge of whether subsequent bits follow.
value_of_accumulation( [B | L], A, X) :-
    B >= 0,
    B =< 1,
    T is % fill this in with math, a function of bit B and previously-accumulated bits A,
    value_of_accumulation( L, %fill this in with prolog understanding.
%累加器的初始值为零(0)。
valueOf(L,X):-累积值(L,0,X)。
%基本情况:
%当没有更多的数字要处理时,输出值(第三个参数)
%与蓄能器统一(第二个参数)
累积值([],A,A)。
%递归步骤。这里有一个数字(B)要处理。这是暂时的
%它将累加器的值“向下传递”到下一个案例
%最终,在可能的更多累积之后,我们将考虑基本情况。保持
%先前从更高有效位派生的累积值,已经存在
%在以前的递归中处理。该子句对每一位调用一次。
%隐式地,该子句的调用生成一个“计数”,但没有
%累积位时计数的实际使用。每一位都是累积的
%不知道后续位是否跟随。
累积值([B | L],A,X):-
B>=0,
B=<1,
T是%用数学、位B的函数和先前累积的位a填充,
_累计值(L%),用prolog理解填写。

您的问题具体是什么?提示:首先更改第三个子句,使其对于单个位数字似乎正常工作。这是在基本情况之前立即执行的情况。接下来,进一步更改第三个子句,使其在使用两位列表调用时正确累加位。突然,您的整个问题就解决了解决了;它现在应该适用于N位了。我感谢所有的解释和帮助。让它起作用了,我不知道它是否是充分的证据,但我拥有的是:valueOf(List,X):-value_of_累计(List,0,X)。value_累计([],A,A)。value_累计([B|L],A,X):-长度(L,NL),t是A+B*2^NL,value_累计(L,t,X)。您需要避免使用该长度函数。您非常接近。您不需要NL或^运算符。只需*和+、A、B和2即可。;)因为A以前是累积的,所以它包含一些已经隐式合成了某种“长度”的内容。您不能以这种方式使用长度的一个原因是:您的算法是O(N^2)运行时,但解决方案应为O(N)。在递归的每一步中,对length()的调用都是O(N),递归的步数是O(N),所以O(N^2)。以下字符的组合只有这么多:2,A,B,*,+。请在“T is”之后使用这些字符中的每一个。我昨晚开始解决这个问题,当我尝试为“1”使用子句,为“0”使用子句时,我决定必须使用累加器和我在回答中描述的基本情况。