使用递归打印数组元素

Kha*_*Ali 1 ada

我正在学习 Ada 编程语言,我可以承认它是强类型的。在这段代码中,我试图让用户输入 4 个整数,然后使用递归打印出这些数字。但是,我在为它编写递归子程序时遇到了麻烦,想知道我是否可以获得有关如何正确编写它的任何建议?

with Ada.Text_IO;                    use Ada.Text_IO;
with Ada.Integer_Text_IO;            use Ada.Integer_Text_IO;

procedure Dugga is
Y: Natural; 
type arr is
 array (1..4) of Natural;
A:arr;

function Recurs(Item: in Natural) return Natural is
begin
  if Item >= 1 then    
    return Get(Item ); --Error: Context requires function call, found procedure name
end if;         
  end Recurs;   

begin
Y:=Recurs(arr);  --Error: expected type "Standard.Integer. Found type: arr 
end Dugga;
Run Code Online (Sandbox Code Playgroud)

警告:Program_error 可能会在运行时引发
“return”语句丢失,此语句之后
错误:在调用 get 时缺少参数“Item”的参数

Jim*_*ers 6

您似乎对递归子程序是什么感到困惑。除非达到终止条件,否则递归子程序会调用自身。如果您的子程序在打印数组元素之前调用自身,则数组元素将以相反的顺序打印。如果您的子程序在打印数组元素后调用自身,则数组元素将按照输入的顺序打印。

with Ada.Text_Io; use Ada.Text_IO;

procedure Main is
   subtype Idx is integer range 1..4;
   type Arr is array (Idx) of Integer;
   procedure Print(Nums : Arr; Index : Idx) is
   begin
      Put (Nums(Index)'Image);
      if Index = Nums'Last then
         New_Line;
      else
         Print(Nums, Index + 1);
      end if;
   end Print;
   
   A : Arr := (1, 2, 3, 4);
begin
   Print(A, A'First);
end Main;
Run Code Online (Sandbox Code Playgroud)

上面的程序声明了一个数组类型并创建了该数组类型的一个实例。过程 Print 是一个递归过程,它在指定的索引值处打印数组的值。然后该过程检查索引值。如果索引值是数组的最后一个索引值,则过程调用 New_Line,否则调用 Print,第二个参数为 Index + 1。