我有一个简单的任务,但不知怎的,我在一个多小时内没有解决它。我正在做的这个递归不起作用,我陷入了一个infinte循环。它应该将数字的最后一位数与其他数字进行比较,并记住最大数字。我真的很想知道为什么我的逻辑错误以及如何解决这个问题。
这是我的尝试:
maxDigit(X,X):-
X<10.
maxDigit(X,N):-
X1 is X//10,
X2 is X mod 10,
maxDigit(X1,N1),
X2=<N1,
N is N1.
maxDigit(X,N):-
X1 is X//10,
X2 is X mod 10,
maxDigit(X1,N1),
X2>N1,
N is X2.
答案 0 :(得分:2)
使用SICStus Prolog 4.3.3,我们只需将n_base_digits/3
和maximum/2
合并为:
?- n_base_digits(12390238464, 10, _Digits), maximum(Max, _Digits). Max = 9.
答案 1 :(得分:2)
评论建议在遇到最大数字时立即停止。这就是我们的方式:
:- use_module(library(clpfd)). :- use_module(library(reif)). #=(X, Y, T) :- X #= Y #<==> B, bool10_t(B, T). bool10_t(1, true). bool10_t(0,false).
根据if_/3
,(;)/3
和(#=)/3
,我们定义:
n_base_maxdigit(N, Base, D) :-
N #> 0, % positive integers only
Base #> 1, % smallest base = 2
D #>= 0,
D #< Base,
n_base_maxdigit0_maxdigit(N, Base, 0, D).
n_base_maxdigit0_maxdigit(N, Base, D0, D) :-
D1 #= N mod Base,
N0 #= N // Base,
D2 #= max(D0,D1),
if_(( D2 + 1 #= Base ; N0 #= 0 ),
D = D2,
n_base_maxdigit0_maxdigit(N0, Base, D2, D)).
使用带有Prolog lambda的SWI-Prolog 7.3.22进行的示例查询:
?- use_module(library(lambda)). true. ?- Max+\ ( N is 7^7^7 * 10+9, time(n_base_maxdigit(N,10,Max)) ). % 663 inferences, 0.001 CPU in 0.001 seconds (100% CPU, 1022162 Lips) Max = 9.
答案 2 :(得分:1)
您只需使用if / then / else:
maxDigit(X,X):-
X<10,
!. % added after false's remark
maxDigit(X,N):-
X1 is X//10,
X2 is X mod 10,
maxDigit(X1,N1),
( X2<N1
-> N = N1
; N = X2).
答案 3 :(得分:0)
可能是:
FrameLayout frame = (FrameLayout) findViewById(R.id.frame);
ImageView image1 = ...
ImageView image2 = ...
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
layoutParams.gravity = Gravity.RIGHT | Gravity.TOP;
i.setLayoutParams(layoutParams);
frame.addView(image1);
frame.addView(image2);