Recursion 如何使用递归将N个浮点数相乘?

Recursion 如何使用递归将N个浮点数相乘?,recursion,ada,Recursion,Ada,我正在为即将到来的考试练习递归问题,我被困在这个问题上了 程序应该取N个浮点数并将它们相乘,所有这些都使用递归 例如: 用户输入2,然后程序将从用户处获取2个浮点值,例如2.0和3.0。那么结果是6.0 我尝试的解决方案是下面的代码。我的核心问题是,我不知道如何以一种有效的方式将浮点数相乘。 现在我的程序所做的就是,它需要N个浮点数,然后只打印最后一个浮点数,而不将它们全部相乘。我确实觉得解决办法很简单,但我真的找不到。希望在这方面能得到一些帮助,提前谢谢 带有Ada.Text\u IO;使用A

我正在为即将到来的考试练习递归问题,我被困在这个问题上了

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

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

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

带有Ada.Text\u IO;使用Ada.Text\u IO;
使用Ada.Integer\u Text\u IO;使用Ada.Integer\u Text\u IO;
使用Ada.Float_Text_IO;使用Ada.Float\u Text\u IO;
程序Recprac3是
---------------------------------- 
程序计算(N:整数;
F:外浮)是
产品:浮动;
开始
如果N=0,则
Put(“产品为:”);
放置(Prod,2,2,0);--2,2,0正在格式化
其他的
Get(F);
F:=Prod;——0);
Put(“浮动:”);
计算(N,F);
末端c3;

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

  • 从用户处获取一个整数N
  • 从用户处获取N个浮点数
  • 使用递归将N个浮点数相乘
  • [隐含]显示先前要求的结果
  • 好的,一种保存一定数量的项目的明显方法是
    数组
    构造;现在,Ada有两种形式:约束和无约束,前者有一定的长度。假设我们从用户那里得到N,我们就不能使用确定形式

    所以,我们使用类似于:
    类型向量是整数的(整数范围)

    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;
    
    其次,还有获取输入、验证输入和使用输入的问题;假设有
    函数输入返回整数
    形式的函数,以及
    浮点
    形式的函数,我们可以在单个函数中处理#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;
    
    这应该足以让你完成你的任务


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

    您需要弄清楚F和Prod的工作是什么。例如,Prod未定义,但是当N=0时显示它,然后用它擦除F的值,否则…您的解决方案似乎是在最内层递归生成结果和从递归返回(out参数)结果之间的中间。你必须决定你选择哪一个want@Zerte是的,也许我需要尝试另一种解决问题的方法…一个函数或一个过程(带有适当的
    in-out
    参数)将完成这项工作。输出结果的过程是
    Ada.Float\u Text\u IO.Put
    ,但是在调用
    Calc
    返回后,您应该从主程序调用它(顺便说一句,
    Calc
    不是一个有用的名称!像
    Product
    这样的名称可能会更好。而且,您不认为参数
    N
    应该是
    正的吗?)。
    F
    的作用是什么?大概是退回产品,在这种情况下,您不应该在
    Calc
    中做的一件事是
    Get(F)
    <代码>获取(Tmp)
    然后决定如何处理它。