繁体   English   中英

使用 Haskell 上的递归,返回给定正 integer 的元组列表

[英]Return list of tuples given a positive integer using recursion on Haskell

我正在尝试定义一个“对”function,它给出一个正数 integer,返回一个正整数对的列表,该对的第一个分量小于或等于第二个分量,其总和等于给定正 integer。 例如:

对 7 = [(1,6),(2,5),(3,4)]
对 10 = [(1,9),(2,8),(3,7),(4,6),(5,5)]

我设法在不使用递归的情况下做到了这一点:

pairs :: Integral a => a -> [(a, a)]    
pairs 1 = []   
pairs x   
  | x <= 0 = error "It is not positive"  
  | mod x 2 == 0 = zip (enumFromTo 1 (div x 2)) (enumFromThenTo (pred x) (pred(pred x)) (div x 2))  
  | otherwise = zip (enumFromTo 1 (div x 2)) (enumFromThenTo (pred x) (pred(pred x)) (succ(div x 2)))

并使用递归:

generateTupleList::  Integral a => [(a, a)] -> [(a, a)]  
generateTupleList[] = undefined  
generateTupleList((a,b):[])  
  | (a + 1) > (b - 1) = ((a,b):[])  
  | otherwise = [(a,b)] ++ generateTupleList(((a+1),(b-1)):[])

pairs:: Integral a => a -> [(a, a)]  
pairs 1 = []  
pairs x  
  | x <= 0 = error "It is not positive"  
  | otherwise = generateTupleList[(1,x-1)]

我的问题如下,有没有其他方法可以使用递归而不创建另一个子函数(在我的情况下为generateTupleList)来“配对” function?

你可以这样做:

pairs :: Integral a => a -> [(a, a)]
pairs x = map (\y -> (y, x - y)) [1..x `div` 2]

如果您不知道, [a..b]等效于enumFromThenTo ab ,并且将 function 包装在反引号中使其行为类似于运算符,因此a `div` bdiv ab相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM