我编写了以下代码,该代码返回列表的第二个元素。
first :: [Int] -> Int
first []= 0
first [x] =x
first (x:x1:xs) = x1
它工作正常,但我希望它可以进行递归操作,例如,只要列表达到第二个数字,它就会给出第二个数字,因此我会继续递归列表。
非常感谢您。
答案 0 :(得分:3)
好问题!通过递归执行此操作的典型方法是使用带有额外参数(通常称为for ev in events:
event_detail = re.search(r'(?<=\d\s\(\w{3}\)).*(?=\d{2}00)', ev)
print(event_detail)
)的递归函数将函数转换为精简包装:
go
但是,Haskell使用currying,因此first :: [Int] -> Int
first list = go 0 list
where
go 1 (x:_) = x
go curIndex (x:xs) = go (curIndex+1) xs
go _ [] = 0
的定义可以稍微简化为first
。
我建议的另一个更改是使用前奏中的first = go 0
类型:
Maybe
也就是说,类型data Maybe a = Just a | Nothing
的值可以是包含Maybe Int
的{{1}}值,也可以是不包含{{1} }。通常,此类型用于计算可能成功或失败的情况,例如该函数!因此,现在可以将其更改为以下内容:
Just
现在,我们可以更改类型,使其更通用(并稍微缩短名称Int
),以给出最终的递归答案。我还将名称更改为Nothing
,因为该名称更好地反映了函数的用途(毕竟,您会得到 second 元素):
Int
答案 1 :(得分:1)
这并不是真正的“自然”递归案例,但是如果您绝对想要递归,则可以编写此代码...
c:\windows\microsoft.net\framework\v4.0.30319\msbuild.exe YourProject.proj /target:rebuild "/property:Configuration=Debug