这个函数怎么写? 有一个数字小游戏,有1。2。3。4。5 这五个数,+ - * / 一次,可以加括号,
使其结果等于22 把所有的答案输入到memo1里,
这个和24点游戏有点不同,就是+-*/只能用一次,括号可以多用!
   
谁能写个递归函数出来呢,学习学习一下!

解决方案 »

  1.   

    多用几个FOR吧。呵呵。一层层的。写起来真是太累了。。
      

  2.   

    whitetiger8(蜗牛[我要一步一步往上爬])  能具体写写吗?谢谢了!
      

  3.   

    我已经贴过了~~
    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;