使用递归查找 N 个数字之和的 Haskell 程序
在 Haskell 中,我们可以使用递归、尾递归和折叠递归来查找 N 个数字之和。在第一个示例中,我们将使用基本情况 (sum_n [] = 0) 和递归情况 (sum_n (x:xs) = x + sum_n xs)),在第二个示例中,我们将使用尾递归。在第三个示例中,我们将使用 (sumOfN''' xs = foldr (+) 0 xs) 函数。
算法
步骤 1 − 递归函数 sum_n 定义如下:
例如 1 −
sum_n [] = 0 sum_n (x:xs) = x + sum_n xs.
例如 2 −
sumOfN' acc 0 = acc sumOfN' acc n = sumOfN' (acc + n) (n-1).
例如 3 −
sumOfN''' xs = foldr (+) 0 xs.
步骤 2 − 程序执行将从 main 函数开始。main() 函数控制整个程序。它被写成 main = do。在 main 函数中,我们创建一个数字列表并将其传递给 sum_n 函数以查找总和。然后打印结果。
步骤 3 − 变量“numbers”被初始化。它将保存需要计算总和的数字列表。
步骤 4 − 在调用 sum_n 函数后,使用“print”函数将数字的总和打印到控制台。
示例 1
在此示例中,函数 sum_n 将整数列表作为输入,并使用模式匹配来检查列表是否为空。如果是,则返回 0。
如果列表不为空,则取第一个元素 (x) 并将其添加到其余列表 (xs) 的总和中。这是使用 sum_n 函数递归完成的。
sum_n :: [Integer] -> Integer sum_n [] = 0 sum_n (x:xs) = x + sum_n xs main :: IO () main = do let numbers = [1,2,3,4,5] print (sum_n numbers)
输出
15
示例 2
在此示例中,定义了一个尾递归函数 sumOfN',它接收两个参数:累加器 acc 和 n。基本情况是当 n 等于 0 时,在这种情况下,函数返回 acc 的值。在所有其他情况下,函数返回使用参数 acc + n 和 n-1 调用 sumOfN' 的结果。该函数使用累加器来跟踪总和并避免堆栈溢出。
sumOfN' :: (Eq a, Num a) => a -> a -> a sumOfN' acc 0 = acc sumOfN' acc n = sumOfN' (acc + n) (n-1) main = print (sumOfN' 0 5)
输出
15
示例 3
在此示例中,使用 foldr 函数查找列表中元素的总和。foldr 函数接收一个二元函数、一个列表,并将二元函数应用于列表的元素,将列表折叠成单个值。在这种情况下,二元函数是 (+) 且初始值为 0,因此它从右侧开始逐个添加列表的元素。
sumOfN''' :: (Num a) => [a] -> a sumOfN''' xs = foldr (+) 0 xs main = print (sumOfN''' [1,2,3,4,5])
输出
15
结论
在 Haskell 中,可以使用用户定义函数的递归或使用尾递归或折叠递归的方法来计算 n 个数字的总和。