Haskell程序 创建一个简单的递归函数
在这篇文章中,我们将了解如何使用用户定义的函数在Haskell中创建一个简单的函数。在这里,用户定义的递归函数将包含基本情况和递归情况。然后,这些函数通过传递参数被递归地调用。
在所有的例子中,我们将定义某些函数来执行某些任务。所有这些函数都包括基数和递归情况。定义的函数包括阶乘、斐波那契、sumList等。
算法
- 第1步 – 用户定义的递归函数被定义为基数和递归情况。
-
第2步 – 程序执行将从主函数开始。main()函数拥有整个程序的控制权。它被写成main = do。在main函数中,用户定义的递归函数被一次又一次地递归调用。
-
第3步 – 递归函数被调用后,其结果被打印到控制台。
例子1
在这个例子中,阶乘函数接收一个整数n作为参数并返回n的阶乘。这个函数是用模式匹配来定义的,其中第一个等式阶乘 0 = 1 是基本情况,第二个等式阶乘 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的余数。
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中,递归允许找到简明而优雅的问题解决方案。它是一种定义具有基数和递归情况的函数的方法。这些函数可以以任何形式接受任何数量的参数,进行任何需要的计算,并在被递归调用后返回结果。