【发布时间】:2020-10-31 16:52:21
【问题描述】:
例如,函数将有两个输入:
-
任意长度的数组,例如
[1, 8, 5, 2, 5, 6, 7, 3, 9, 4]. -
目标总和,例如
10.
输出将是一个包含所有对目标求和的数字对的数组,例如[(1,9),(8,2),(5,5),(7,3),(6,4)].
我完全不知道如何创建此代码。如果有人可以提供一些见解,以下是我到目前为止的内容,但它不起作用:
sums :: (Num a, Num b) => [a] -> b -> [(a,a)]
sums ([x] i) = (x i)
sums (x:xs) i
| x == [] = []
| x + sums(xs) == i = [(x,xs)]
| otherwise = []
【问题讨论】:
-
欢迎来到 StackOverflow。我们在这里不回答没有表现出自己努力解决问题的问题。当你“卡住”时,你显然已经尝试了一些自己的想法,所以一定要展示它们。
-
顺便说一句,Haskell 中的
[1,8,5]不是数组而是列表。 -
不幸的是,您的代码看起来像是在墙上扔了一堆语法和函数,希望有什么东西可以坚持。它与有效的 Haskell 完全不同,我无法理解它应该是什么意思。您能否先用清晰准确的语言解释您希望如何解决问题?这似乎是一个乏味的步骤,但它确实是让您的想法井然有序的好方法。
-
我将从一个小提示开始:您的数字类型肯定应该相同。你的类型签名应该看起来像
sums :: (Num a, Eq a) => [a] -> a -> [(a,a)]。更高效的函数版本需要更受约束的类型:sums :: (Num a, Ord a) => [a] -> a -> [(a,a)]甚至sums :: Integral a => [a] -> a -> [(a,a)],但您应该先尝试更简单的Eq版本。 -
列表元素是否允许使用两次?也就是说,如果 5 在输入中只出现一次,你还能产生
(5,5)吗?
标签: list haskell recursion sum combinations