Haskell 程序创建一个简单的递归函数

haskellserver side programmingprogramming

在本文中,我们将了解如何使用用户定义函数在 Haskell 中创建一个简单的函数。在这里,用户定义的递归函数被定义,它将包含基本情况和递归情况。然后,通过将参数传递给它来递归调用这些函数。

在所有示例中,我们将定义某些函数来执行某些任务。所有这些函数都包括基本情况和递归情况。定义的函数包括阶乘、斐波那契、sumList 等。

算法

  • 步骤 1 - 用户定义的递归函数使用基本情况和递归情况定义。

  • 步骤 2 - 程序执行将从主函数开始。main() 函数完全控制程序。它写为 main = do。在主函数中,用户定义的递归函数被一次又一次地递归调用

  • 步骤 3 - 递归调用函数后,结果将打印到控制台。

示例 1

在此示例中,阶乘函数以整数 n 作为参数并返回 n 的阶乘。该函数使用模式匹配定义,其中第一个方程阶乘 0 = 1 是基本情况,第二个方程阶乘 n = n * 阶乘 (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 中,递归允许找到问题的简洁而优雅的解决方案。它是一种使用基本和递归情况定义函数的方法。这些函数可以以任何形式接受任意数量的参数,执行任何所需的计算,并在递归调用后返回结果。


相关文章