使用递归查找两个数字乘积的 Haskell 程序
在 Haskell 中,我们可以使用递归以及递归重复加法来找到两个数字的乘积。在第一个示例中,我们将使用 (product' x y | y == 0 = 0 | y == 1 = x | otherwise = x + product' x (y-1)) 函数。在第二个示例中,我们将使用递归重复加法。
算法
步骤 1 - 递归函数 product' 定义如下:
对于示例 1 和 2 -
product' x y | y == 0 = 0 | y == 1 = x | otherwise = x + product' x (y-1).
对于示例 3 -
product' x y | y == 0 = 0 | y == 1 = x | otherwise = x + product' x (y-1).
步骤 2 - 程序执行将从 main 函数开始。main() 函数控制整个程序。它被写成 main = do。在 main 函数中,我们定义了 x 和 y,并使用 print 函数输出 product' x y 的结果。
步骤 3 - 变量 “x” 和 “y” 被初始化。它将保存要计算乘积的数字。
步骤 4 - 调用 product' 函数后,使用 'print' 函数将两个数字的乘积结果打印到控制台。
示例 1
在这个示例中,我们定义了一个名为 product' 的函数,它接收两个整数 x 和 y 作为输入。该函数使用递归来查找这两个数字的乘积。基本情况是当 y 等于 0 时,函数返回 0。下一个基本情况是当 y 等于 1 时,函数返回 x。如果这两个基本情况都不满足,则函数递归调用自身,输入为 x 和 y-1,并将结果加到 x 上。
product' :: Integer -> Integer -> Integer product' x y | y == 0 = 0 | y == 1 = x | otherwise = x + product' x (y-1) main :: IO () main = do let x = 2 let y = 5 print (product' x y)
输出
10
示例 2
在这个示例中,我们将看到如何找到两个数字的乘积。这可以通过使用尾递归来完成。这里,该函数使用一个名为 productTailHelper 的辅助函数,它接收三个参数:x、y 和累加器 acc。递归的基本情况是当 y 等于 0 时,函数返回 acc。在递归情况下,该函数自身调用,更新的参数为 x、y-1 和 acc+x,这会用乘积计算中的下一个值更新累加器。当递归到达基本情况时,返回最终结果。
productTail :: Integer -> Integer -> Integer productTail x y = productTailHelper x y 0 where productTailHelper x y acc | y == 0 = acc | otherwise = productTailHelper x (y-1) (acc+x) main :: IO () main = do let x = 3 let y = 4 print (productTail x y)
输出
12
示例 3
此示例利用了乘法只是重复加法的事实。它首先检查第二个数字 (y) 是否为 0,如果是,则乘积为 0。如果 y 为 1,则乘积仅为 x。否则,函数自身调用,输入为 x 和 y-1,并将 x 加到结果中,有效地将 x 自身加 y 次。
product' :: Integer -> Integer -> Integer product' x y | y == 0 = 0 | y == 1 = x | otherwise = x + product' x (y-1) main :: IO () main = do let x = 3 let y = 4 print (product' x y)
输出
12
结论
在 Haskell 中,可以通过使用递归以及辅助函数作为尾递归或使用重复加法来计算两个数字的乘积。