使用遞迴查詢 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 個數字的總和。

更新於: 2023 年 3 月 27 日

721 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.