Variables 求解并产生一个给定集合所索引的变量和方程(Haskell)
我想在Haskell中解决以下问题: 设n是一个自然数,a=[d_1,…,d_r]是一组正数 我想找到下列方程的所有正解:Variables 求解并产生一个给定集合所索引的变量和方程(Haskell),variables,haskell,indexing,linear-equation,Variables,Haskell,Indexing,Linear Equation,我想在Haskell中解决以下问题: 设n是一个自然数,a=[d_1,…,d_r]是一组正数 我想找到下列方程的所有正解: n=Sum d_i^2 x_i 例如,如果n=12和集合A=[1,2,3]。我想在自然数上解以下方程: x+4y+9z=12. 使用以下代码就足够了: [(x,y,z) | x<-[0..12], y<-[0..12], z<-[0..12], x+4*y+9*z==12] [(x,y,z)| x一些提示: 最终,您希望编写具有此签名的函数: solu
n=Sum d_i^2 x_i
例如,如果n=12
和集合A=[1,2,3]
。我想在自然数上解以下方程:
x+4y+9z=12.
使用以下代码就足够了:
[(x,y,z) | x<-[0..12], y<-[0..12], z<-[0..12], x+4*y+9*z==12]
[(x,y,z)| x一些提示:
最终,您希望编写具有此签名的函数:
solutions :: Int -> [Int] -> [ [Int] ]
示例:
solutions 4 [1,2] == [ [4,0], [0,1] ]
-- two solutions: 4 = 4*1^2 + 0*2^2, 4 = 0*1^2 + 1*2^2
solutions 22 [2,3] == [ [1,2] ]
-- just one solution: 22 = 1*2^2 + 2*3^2
solutions 10 [2,3] == [ ]
-- no solutions
步骤2.根据列表结构递归定义解决方案
:
solutions x [a] = ...
-- This will either be [] or a single element list
solutions x (a:as) = ...
-- Hint: you will use `solutions ... as` here
一些提示:
最终,您希望编写具有此签名的函数:
solutions :: Int -> [Int] -> [ [Int] ]
示例:
solutions 4 [1,2] == [ [4,0], [0,1] ]
-- two solutions: 4 = 4*1^2 + 0*2^2, 4 = 0*1^2 + 1*2^2
solutions 22 [2,3] == [ [1,2] ]
-- just one solution: 22 = 1*2^2 + 2*3^2
solutions 10 [2,3] == [ ]
-- no solutions
步骤2.根据列表结构递归定义解决方案
:
solutions x [a] = ...
-- This will either be [] or a single element list
solutions x (a:as) = ...
-- Hint: you will use `solutions ... as` here
您可以使用带有do
-符号的递归调用来代替列表理解
这有点棘手,因为您必须正确处理边缘情况,我允许自己进行一些优化:
solve :: Integer -> [Integer] -> [[Integer]]
solve 0 ds = [replicate (length ds) 0]
solve _ [] = []
solve n (d:ds) = do
let maxN = floor $ fromIntegral n / fromIntegral (d^2)
x <- [0..maxN]
xs <- solve (n - x * d^2) ds
return (x:xs)
评论
当处理负数时,这将失败-如果您需要负数,您将不得不引入更多的情况-我相信您已经解决了它们(在这一点上,它实际上比Haskell更复杂)而不是列表理解,您可以对列表单子使用带do
-符号的递归调用
这有点棘手,因为您必须正确处理边缘情况,我允许自己进行一些优化:
solve :: Integer -> [Integer] -> [[Integer]]
solve 0 ds = [replicate (length ds) 0]
solve _ [] = []
solve n (d:ds) = do
let maxN = floor $ fromIntegral n / fromIntegral (d^2)
x <- [0..maxN]
xs <- solve (n - x * d^2) ds
return (x:xs)
评论
当处理负数时,这将失败-如果你需要负数,你将不得不引入更多的例子-我确信你能解决它们(这一点上比Haskell更复杂)你在寻找这个[(x,y,z,n)|我需要更多的变量。变量的数量与集合A的基数相同。如果集合A是A=[1,2,3,4,6],那么方程是A+2b+9c+16d+36e=n。你需要基数走多远?你在寻找这个[(x,y,z,n)|我需要更多的变量。变量的数量与集合A的基数相同。如果集合A设为A=[1,2,3,4,6]。那么方程是A+2b+9c+16d+36e=n。你还需要多少基数?集合A的基数根本不会改变,甚至“n”都是固定的。@没有人应该读这个问题:“我的问题是,如果n不固定,集合A也不固定。"我的意思是,你的解决方案的集合A和'n'不会改变。对不起,我不知道你在说什么-这两个例子使用不同的n
和不同的A
作者需要集合A是一组基本变量,如果我没有弄错的话,可以按平方改变。集合A的基数根本不会改变,even'n'是固定的。@没有人应该读这个问题:“我的问题是如果n不固定,集合A也不固定。”我的意思是你的解决方案的集合A和'n'不会改变。对不起,我不知道你在说什么-这两个例子使用不同的n
和不同的A
作者需要集合A是一组基本变量,如果我没有弄错的话,可以按平方改变。