2013-03-10 80 views
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; 

回答

2

你不提供递归,即结束了,你总是再次拨打您的功能GetOddNumbersAmount,和你的程序永远不会终止。因此,你会得到一个数组索引错误(或堆栈溢出),并且你的程序崩溃。

请注意,每次递归都需要一个终止的情况,即而不是自己调用。在你的情况下,如果数组中没有元素,它应该返回。

此外,你正在计算偶数,而不是奇数。

+0

谢谢你队友! – sbxmal 2013-03-10 20:50:13

+0

这也是递归的一个可怕的证明。叹。 – Thomas 2013-03-10 21:56:52

0

你通过一个静态数组到一个动态的,所以该指数感到困惑: 阵列Allocat与 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; 

末;