我需要编写递归函数来计算序列中奇数的数量
这是我的初始代码:
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;
答案 0 :(得分:2)
您不提供递归的结束,即,您总是再次调用函数GetOddNumbersAmount
,并且您的程序永远不会终止。因此,您得到一个数组索引错误(或堆栈溢出),您的程序崩溃。
请注意,每次递归都需要一个终止的情况,即不调用自身。在你的情况下,如果数组中没有元素,它应该返回。
此外,您正在计算偶数,而不是奇数。
答案 1 :(得分: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;
端;