Haskell程式:建立簡單的遞迴函式


在本文中,我們將學習如何使用使用者自定義函式在Haskell中建立一個簡單的函式。這裡定義了使用者自定義的遞迴函式,其中包含基本情況和遞迴情況。然後,透過向其傳遞引數來遞迴呼叫這些函式。

在所有示例中,我們將定義某些函式來執行某些任務。所有這些函式都包括基本情況和遞迴情況。定義的函式包括階乘、斐波那契數列、sumList等。

演算法

  • 步驟1 - 定義具有基本情況和遞迴情況的使用者自定義遞迴函式。

  • 步驟2 - 程式執行將從main函式開始。main()函式控制整個程式。它寫成main = do。在main函式中,使用者自定義的遞迴函式將被反覆遞迴呼叫。

  • 步驟3 - 函式遞迴呼叫後,結果將列印到控制檯。

示例1

在這個例子中,階乘函式接受一個整數n作為引數,並返回n的階乘。該函式使用模式匹配定義,其中第一個方程factorial 0 = 1是基本情況,第二個方程factorial n = n * factorial (n-1)是遞迴情況。

factorial :: Int -> Int
factorial 0 = 1
factorial n = n * factorial (n-1)

main = do
   let result = factorial 5
   print result

輸出

120

示例2

在這個例子中,fib函式接受一個整數n作為引數,並返回第n個斐波那契數。該函式使用模式匹配定義,其中前兩個方程fib 0 = 0和fib 1 = 1是基本情況,第三個方程fib n = fib (n-1) + fib (n-2)是遞迴情況。

fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

main = do
   let result = fib 10
   print result

輸出

55

示例3

在這個例子中,sumList函式接受一個整數列表xs作為引數,並返回其元素的總和。該函式使用模式匹配定義,其中第一個方程sumList [] = 0是基本情況,第二個方程sumList (x:xs) = x + sumList xs是遞迴情況。

sumList :: [Int] -> Int
sumList [] = 0
sumList (x:xs) = x + sumList xs

main = do
   let result = sumList [1,2,3,4,5]
   print result

輸出

15

示例4

在這個例子中,定義了一個函式sumOfNaturalNumbers,它接受一個整數n作為引數,並遞迴呼叫自身,直到達到n = 0的基本情況。在每次遞迴呼叫中,當前的n值都會新增到先前值的總和中。

sumOfNaturalNumbers :: Integer -> Integer
sumOfNaturalNumbers 0 = 0
sumOfNaturalNumbers n = n + sumOfNaturalNumbers (n - 1)

main :: IO ()
main = do
   let n = 10
   print (sumOfNaturalNumbers n)

輸出

55

示例5

在這個例子中,gcd'函式接受兩個整數x和y,並使用遞迴來查詢它們的GCD。遞迴的基本情況是當y等於0時,在這種情況下,GCD只是x。在所有其他情況下,該函式將自身與引數y和x mod y呼叫,後者計算x除以y的餘數。這將持續進行,直到餘數為0,此時函式將返回GCD。

gcd' :: Int -> Int -> Int
gcd' x y
   | y == 0    = x
   | otherwise = gcd' y (x `mod` y)

main :: IO ()
main = do
   let x = 48
   let y = 18
   print (gcd' x y)

輸出

6

示例6

在這個例子中,reverseSentence函式接受一個字串作為輸入,並使用遞迴來反轉字串中字元的順序。遞迴的基本情況是當輸入字串為空時,在這種情況下,函式返回一個空字串。在遞迴情況下,該函式將自身與輸入字串減去第一個字元一起呼叫,然後將輸入字串的第一個字元連線到遞迴呼叫返回的反轉字串的末尾。

reverseSentence :: String -> String
reverseSentence [] = []
reverseSentence (x:xs) = reverseSentence xs ++ [x]

main :: IO ()
main = do
   let sentence = "Hello World!"
   print (reverseSentence sentence)

輸出

"!dlroW olleH"

結論

在Haskell中,遞迴允許找到簡潔優雅的解決方案。它是一種使用基本情況和遞迴情況定義函式的方法。這些函式可以採用任何形式的任意數量的引數,執行任何所需的計算,並在遞迴呼叫後返回結果。

更新於:2023年3月1日

1K+ 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告