我正在学习尾递归,并且在确定我的函数是否是尾递归时遇到了一些困难(主要是在我使用另一个函数的函数上)。
我已经实现了以下两个函数,但我不确定它们是否是尾递归的。
第一个是连接两个列表的函数。
conca list [] = list
conca [] result = result
conca (h:t) result = conca (init (h:t)) ( last(h:t):result )
concatenate::[a]->[a]->[a]
concatenate list1 list2 = conca list1 list2
函数中的计算在递归调用之前处理,但它使用 last 和 init,它们不是尾递归(我在http://ww2.cs.mu.oz.au/172/Haskell/tourofprelude中检查了它们的定义.html )
第二个功能是删除给定列表中给定数字的第一次出现。
invert [] result = result
invert (h:t) result = invert t (h:result)
remov n [] aux result = invert result []
remov n (h:t) aux result
| aux==1 = remov n t 1 (h:result)
| n==h = remov n t 1 (result)
| otherwise = remov n t 0 (h:result)
remove n list = remov n list 0 []
参数 aux (可以假定 0 或 1 作为值)用于标记是否已删除出现。
在 remove 函数中,当部分结果通过递归调用向下传递时,列表被反转,最后列表没有第一次出现而是倒置,因此它必须被反转才能作为结果返回。