首页 > 解决方案 > 如何使用递归乘以 N 个浮点数?

问题描述

我正在为即将到来的考试练习递归问题并且已经陷入了这个问题。

该程序应该采用 N 个浮点数并将它们相乘,所有这些都使用递归。

示例:用户输入 2,然后程序将从用户那里获取 2 个浮点数,例如 2.0 和 3.0。然后结果是 6.0。

我尝试的解决方案是下面的代码。我的核心问题是我不知道我应该如何以一种有效的方式将浮点数相乘。现在我的程序所做的就是它需要 N 个浮点数,然后只打印最后一个而不将它们全部相乘。我确实觉得解决方案很简单,但我真的找不到。希望对此有所帮助,在此先感谢。

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

    procedure Recprac3 is
       ---------------------------------- 
       procedure Calc(N : in Integer;
                    F : out Float) is
          Prod : Float;
       begin
          if N = 0 then
             Put("The product is: ");
             Put(Prod, 2, 2, 0);       -- 2, 2, 0 is formatting
          else                        
             Get(F);
             F := Prod;                -- <------- Problem area
             Prod := Prod * F;
             Calc((N-1), F);
          end if;
       end Calc;
       ----------------------------------    
    N : Integer;
    F : Float;

    begin
       Put("Get an integer: ");
       Get(N);
       Put("Get ");
       Put(N, Width => 0);
       Put(" floats: ");
       Calc(N, F);
    end Recprac3;

标签: recursionada

解决方案


好的,所以让我们从需求中分解,“该程序应该采用 N 个浮点数并将它们相乘,所有这些都使用递归。 ”:

  1. 从用户那里获取一个整数 N。
  2. 从用户那里获取 N 个浮点数。
  3. 使用递归将 N 个浮点数相乘。
  4. [隐含] 显示上一个需求的结果。

好吧,保存一些项目的一个明显方法是Array构造;现在,Ada 有两种形式:受约束的和不受约束的,前者有一定的长度。鉴于我们从用户那里得到 N,我们不能使用确定的形式。

所以,我们使用类似的东西:Type Vector is (Integer range <>) of Integer;.

Ada 还给出了一些有趣的属性:Length, First, Last, Pred, Succ, 等等。还有一个“空范围”的概念,它应用于数组将指示长度为零;这为我们提供了一个很好的基本案例。

-- There IS a bug here, you have to find it.
Function Multiply( Input : Vector ) return Float is
   Subtype Internal is Integer 
      range Integer'Succ(Input'First)..Integer'Pred(Input'Last);
Begin
   Return (if Input'Length not in Positive then 1.0
           else Input(Input'First) * Input(Input'Last) * Multiply(Input(Internal))
          );
End;

接下来是获取输入、验证和使用输入的问题;假设有形式为 的函数,Function Input return Integer对于 也是如此Float,我们可以在一个函数中处理#1 和#2:

Function Input return Float is
Begin
    Loop
        Ada.Text_IO.Put_Line( "Input a value:" );
        declare
            Text : String renames Ada.Text_IO.Get_Line;
        begin
            return Float'Value( Text );
        -- SOMETHING GOES HERE.
        end;
    end loop;
end Input;

Function Results return Vector is
Begin
   Return Result : Vector(1..Input):= (others => Input);
End;

这应该足以让您完成任务。

注意:此处的构造必须适合您的使用。


推荐阅读