这个函数怎么写? 有一个数字小游戏,有1。2。3。4。5 这五个数,+ - * / 一次,可以加括号,
使其结果等于22 把所有的答案输入到memo1里,
这个和24点游戏有点不同,就是+-*/只能用一次,括号可以多用!
谁能写个递归函数出来呢,学习学习一下!
使其结果等于22 把所有的答案输入到memo1里,
这个和24点游戏有点不同,就是+-*/只能用一次,括号可以多用!
谁能写个递归函数出来呢,学习学习一下!
http://www.eping.net/fourmvar
vNumbers: array[0..4] of Extended;
vExpressions: array[0..4] of string;
vOutputStrings: TStrings;const
cPrecision = 1E-6;
cDest = 22;procedure Init(mStrings: TStrings);
var
I: Integer;
begin
vOutputStrings := mStrings;
vOutputStrings.Clear;
for I := 0 to 4 do begin
vNumbers[I] := I + 1;
vExpressions[I] := IntToStr(I + 1);
end;
end;procedure SearchExpression(mLevel: Integer; mOperators: string);
var
I, J: Integer;
A, B: Extended;
vExpA, vExpB: string;
begin
if (mLevel <= 1) and (Abs(vNumbers[0] - cDest) <= cPrecision) then begin
vOutputStrings.Add(vExpressions[0]);
Exit;
end; for I := 0 to mLevel - 1 do begin
for J := I + 1 to mLevel - 1 do begin
A := vNumbers[I];
B := vNumbers[J];
vNumbers[J] := vNumbers[mLevel - 1]; vExpA := vExpressions[I];
vExpB := vExpressions[J];
vExpressions[J] := vExpressions[mLevel - 1]; if Pos('+', mOperators) <= 0 then begin
vExpressions[I] := '(' + vExpA + '+' + vExpB + ')';
vNumbers[I] := A + B;
SearchExpression(mLevel - 1, mOperators + '+');
end;
if Pos('-', mOperators) <= 0 then begin
vExpressions[I] := '(' + vExpA + '-' + vExpB + ')';
vNumbers[I] := A - B;
SearchExpression(mLevel - 1, mOperators + '-');
vExpressions[I] := '(' + vExpB + '-' + vExpA + ')';
vNumbers[I] := B - A;
SearchExpression(mLevel - 1, mOperators + '-');
end;
if Pos('*', mOperators) <= 0 then begin
vExpressions[I] := '(' + vExpA + '*' + vExpB + ')';
vNumbers[I] := A * B;
SearchExpression(mLevel - 1, mOperators + '*');
end;
if Pos('/', mOperators) <= 0 then begin
if B <> 0 then begin
vExpressions[I] := '(' + vExpA + '/' + vExpB + ')';
vNumbers[I] := A / B;
SearchExpression(mLevel - 1, mOperators + '/');
end;
if A <> 0 then begin
vExpressions[I] := '(' + vExpB + '/' + vExpA + ')';
vNumbers[I] := B / A;
SearchExpression(mLevel - 1, mOperators + '/');
end;
end;
vNumbers[I] := A;
vNumbers[J] := B;
vExpressions[I] := vExpA;
vExpressions[J] := vExpB;
end;
end;
end;procedure Calc;
begin
vOutputStrings.BeginUpdate;
try
SearchExpression(5, '');
finally
vOutputStrings.EndUpdate;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
Init(Memo1.Lines);
Calc;
end;