0

シーケンス内の奇数の数をカウントする再帰関数を作成する必要があります

ここに私の最初のコードがあります:

program OddNumbers;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function GetOddNumbersAmount(const x: array of integer; count,i:integer):integer;
begin
   if((x[i] <> 0) and (x[i] mod 2=0)) then
   begin
     count:= count + 1;
     GetOddNumbersAmount:=count;
   end;

   i:=i+1;
   GetOddNumbersAmount:=GetOddNumbersAmount(x, count, i);
end;


var X: array[1..10] of integer;
    i,amount: integer;

begin
  writeln('Enter your sequence:');

  for i:=1 to 10 do
    read(X[i]);

  amount:= GetOddNumbersAmount(X, 0, 1);
  writeln('Amount of odd numbers: ', amount);

  readln;
  readln;
end.

シーケンスを入力して「Enter」を押すと、プログラムはエラーなしで閉じられ、結果が表示されません。

また、私の機能が正しくないと思います。誰かがそのコードを手伝ってもらえますか?

UPD:

function GetOddNumbersAmount(const x: array of integer; count,i:integer):integer;
begin
   if((x[i] <> 0) and (x[i] mod 2<>0)) then
     count:= count + 1;

   if(i = 10) then
     GetOddNumbersAmount:=count
   else
     GetOddNumbersAmount:=GetOddNumbersAmount(x, count, i+1);
end;
4

2 に答える 2

2

再帰の終わりを提供しません。つまり、常に関数GetOddNumbersAmountを再度呼び出し、プログラムが終了することはありません。したがって、配列インデックス エラー (またはスタック オーバーフロー) が発生し、プログラムがクラッシュします。

すべての再帰には、終了するケースが必要であることに注意してください。つまり、それ自体を呼び出さないでください。あなたの場合、配列に要素が残っていない場合は返されます。

さらに、奇数ではなく偶数を数えています。

于 2013-03-10T20:41:28.843 に答える