haskell - 实现尾递归
问题描述
我在 haskell 中编写了一个简单的函数,它是非尾递归的,它总结了列表中的值,其中:
nonTailRecursiveSum :: [Integer] -> Integer
nonTailRecursiveSum [] = 0 --base case
nonTailRecursiveSum (x:xs) = x + sum xs
但是我现在要做的是实现相同的功能,但使用尾递归。据我所知,尾递归在最后一步执行递归调用,所以我尝试了类似的方法:
tailRecursiveSum :: [Integer] -> Integer
tailRecursiveSum [] = 0
tailRecursiveSum (x:xs) = aux_f(x) + tailRecursiveSum xs
.
.
但是我在中途迷路了,因为我不熟悉 Haskell 中的尾递归。任何人都可以帮助我继续代码的尾递归版本吗?
解决方案
玩了一会儿,
sum (x:y:xs) = x + sum (y:xs)
= x + (y + sum xs)
= (x + y) + sum xs
g a b = a + sum b
sum (x:y:xs) = g x (y:xs)
= x + g y xs
= g (x+y) xs -- !!!
最后一个是尾递归形式!因此我们只定义
sum xs = g 0 xs
where
g acc [] = ...
g acc (x:xs) = g (acc + ...) ...
填空!
推荐阅读
- python - 将 Slugs 添加到 URL 模式
- android - 如何将 MediaQueryData 添加到空间填充?
- java - 在 Java 14 中定义 Records 类(JEP 359:Records(Preview))的括号内空格的 IntelliJ 编辑器代码样式设置?
- r - R Studio 版本 1.2.5033 - 安装包问题第 1 部分
- php - Laravel SweetAlert 在验证失败块中不起作用
- validation - 如何使用 Yup 验证电话号码但不是必需的?
- dynamics-crm - CRM 365 - 隐藏站点地图区域
- python - Python:“浮点”对象不能解释为整数?
- java - 覆盖嵌入 id 的列名
- scikit-learn - 为什么 `scoring="neg_log_loss"` 和 `scoring=make_scorer(log_loss)` 给出如此不同的验证分数?