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