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+ 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.