2

最初の質問のように、数値を 10 進法から別の数値 (基数 2 から 9) に変換するプログラムを作成する必要があります。

しかし、今回は再帰関数を使用して作成する必要があります。だから私は一緒に来ました:

function cambiarBase(n,b: integer): string;
Begin
if n < b then
  cambiarBase := inttostr(n)
else 
  cambiarBase := inttostr(n mod b) + cambiarBase(n div b, b);
End;

'n' は 10 進数、'b' は基数の 2 つの整数変数を取り、変換された数値を含む文字列を返します。ボタンの手順で、TMemoに番号を表示します

memo1.Lines.Add(cambiarBase(n,b)); 

私が抱えている問題は次のとおりです。関数を使用すると、数字が逆の順序で表示されます(たとえば、9進数の301は364ですが、463と表示されます)。しかし、if ステートメントの後に ReverseString 関数を使用すると、数値が別の順序で表示されます (この例では、数値は 634 になります)。

しかし、memo1.Lines.Add (関数の外側) で ReverseString 関数を適用すると、正しい変換が表示されます。

私が欲しいのは、関数自体によって正しい桁の順序を返す方法を知ることです。

プログラムはエラーなしでコンパイルします。

繰り返しますが、読んでくれてありがとう。

LeoAM

4

1 に答える 1

4

連結の順序を逆にするだけです。それ以外の:

cambiarBase := inttostr(n mod b) + cambiarBase(n div b, b);

あなたが書く

cambiarBase := cambiarBase(n div b, b) + inttostr(n mod b);

これについて考えると、連結がこのように行われるべきであることは明らかです。その式では、inttostr(n mod b)用語は重要度の低い用語であるため、右側に表示されます。

Resultそれだけの価値があるため、このコードは、関数名ではなく使用した方がはるかに読みやすいと思います。特に再帰関数の場合、結果変数と再帰呼び出しを視覚的に区別するのが難しい場合があります。私は次のように書きます:

function cambiarBase(n, b: Integer): string;
begin
  if n < b then
    // termination
    Result := IntToStr(n)
  else 
    // recursive step
    Result := cambiarBase(n div b, b) + IntToStr(n mod b);
end;

説明のために簡単な例を見てみましょう。123 (16 + 2*4 + 3) に等しいことがわかっている 27 基数 4 としましょう。

cambiarBase(27, 4) = cambiarBase(6, 4) + inttostr(3)

次に評価する必要があります

cambiarBase(6, 4) = cambiarBase(1, 4) + inttostr(2)

そして最後は解約

cambiarBase(1, 4) = inttostr(1)

すべてを一緒に接続すると、

cambiarBase(27, 4) = inttostr(1) + inttostr(2) + inttostr(3)
于 2014-03-24T21:01:24.777 に答える