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.

当我输入序列并按“输入”时,程序关闭且没有任何错误,我看不到结果。

另外,我认为我的功能不正确。有人可以帮助处理该代码吗?

升级版:

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 回答
0

您将静态数组传递给动态数组,因此索引会混淆:使用 SetLength(X,10) 分配数组会分配一个由 10 个整数组成的数组,索引为 0 到 9。

动态数组总是整数索引,总是从 0 开始!

  SetLength(X,10)
  for it:=0 to 9 do begin
    X[it]:= random(100);

其次,如果您知道循环的长度有更多优势:

function GetEvenNumbersAmount(const x: array of integer; count,i:integer):integer;
begin
  for i:= 0 to length(X)-1 do 
    if((x[i] <> 0) and (x[i] mod 2=0)) then begin
    inc(count);
   //write(inttostr(X[i-1])+ ' ')  :debug
   end;
 result:=count;

结尾;

于 2014-08-23T18:23:11.643 回答