Haskell/解决方案/递归
外观
练习 |
---|
|
factorial
可以定义如下factorial 0 = 1 factorial n = n * factorial(n - 1)
- 输入
factorial (-1)
应该会显示消息*** Exception: stack overflow
。这是因为根据定义,factorial (-1)
是(-1) * factorial (-2)
,即(-1) * (-2) * factorial (-3)
。这将永远不会停止,因此函数将一直运行,直到它耗尽内存。 doubleFactorial
可以定义如下
doubleFactorial 0 = 1
doubleFactorial 1 = 1
doubleFactorial n = n * doubleFactorial (n-2)
练习 |
---|
|
1. 5 × 4
- 4 不等于 1,因此我们递归:计算 5 × 3
- 3 不等于 1,因此我们递归
- 2 不等于 1,因此我们递归
- 1 等于 1,因此我们返回 5
- 我们将当前数字 5 加到递归结果 5 中。我们得到 10
- 我们将当前数字 5 加到递归结果 10 中。我们得到 15
- 我们将当前数字 5 加到递归结果 15 中。我们得到 20。
2.
power x 0 = 1
power x y = x * power x (y-1)
3.
addition x 0 = x
addition x y = plusOne (addition x (y-1))
4.
log2 1 = 0
log2 n = 1 + log2 (n `div` 2) -- the "`" make div into infix notation
练习 |
---|
为以下基于列表的函数给出递归定义。在每种情况下,考虑基本情况是什么,然后考虑一般情况在比它小的所有事物方面会是什么样子。
|
1-3 的答案,在一个代码块中
replicat 0 _ = []
replicat n thing = thing : replicat (n-1) thing
[] !! _ = error "Index too large" -- An empty list has no elements.
(x:_) !! 0 = x
(x:xs) !! n = xs !! (n-1)
zip [] _ = []
zip _ [] = []
zip (x:xs) (y:ys) = (x,y) : zip xs ys
(x:xs)
不匹配空列表,因此你也可以有
zip (x:xs) (y:ys) = (x,y) : zip xs ys
zip _ _ = []
以下是累积的 length
length xs = go 0 xs
where
go acc [] = acc
go acc (_:xs) = go (acc + 1) xs