recursion - 如何使用递归乘以 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;
解决方案
好的,所以让我们从需求中分解,“该程序应该采用 N 个浮点数并将它们相乘,所有这些都使用递归。 ”:
- 从用户那里获取一个整数 N。
- 从用户那里获取 N 个浮点数。
- 使用递归将 N 个浮点数相乘。
- [隐含] 显示上一个需求的结果。
好吧,保存一些项目的一个明显方法是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;
这应该足以让您完成任务。
注意:此处的构造必须适合您的使用。
推荐阅读
- python - 从 txt 文件记录 URL
- python - 从 Python 中的嵌套列表制作直方图
- c# - DevExpress GridView for MVC - 如何设置模板单元格的默认值
- java - Android:切换纵向和横向时保存和恢复活动数据
- javascript - Plesk Obsidian、IISNode 和 Express 问题 - 应用程序只能在本地运行
- swift - Swift != 在 switch 语句中
- sql-server - 创建这些表的正确方法是什么?
- sql - 填充 CartesianChart 时,对象不能从 DBNULL 转换为其他类型异常
- r - 编译 Rpackage 的问题:使用 Rcpp 的 asNamespace(ns) 中的错误
- python - 自动完成之前在列表中的单词