如何解决给定N,对于从1到N的连续数字,创建一个递归C#方法以打印出所有可能导致X的'+'和'-'组合
我正在处理以下任务,由于我对递归不是很熟悉,所以很茫然。如果有更多经验的人可以向我指出正确的方向,我将不胜感激。
作业内容如下: 编写一个控制台应用程序,确定“ +”和“-”运算符的所有组合,这些组合可以放在介于1到给定N> = 2的自然数之间,以使表达式的结果为给定的X数。如果没有可能的组合,则应用程序将输出“ N / A”。
例如:
对于输入:
6 // N
3 // X
控制台将显示为:1 + 2 + 3 - 4 - 5 + 6 = 3
1 + 2 - 3 + 4 + 5 - 6 = 3
1 - 2 - 3 - 4 + 5 + 6 = 3
鉴于分配的情况,除“系统”外,不允许使用其他任何指令。我已经找到了这个“硬币找零”问题的多个版本,但大多数使用C ++或Python,而且与我当前的工作也有很大不同。我不是要任何人为我做作业,我只是在寻找一些有效的指针,以便我知道从哪里开始。
解决方法
我将创建一个包含5个参数的函数(我们将其称为f):当前编号,结束编号(N),期望的结果(X),到目前为止的公式以及迄今为止的公式结果。
首先在函数中测试当前号码是否为结束号码。如果是,则测试公式的结果是否为所需的数字。如果是这样,请打印公式。
如果您还没有结束,请两次调用函数本身。在下一个数字处添加一次,在下一个数字处减去一次。
该函数的第一个调用是 f(1、6、3,“ 1”,1)。然后它会用两次调用自己 f(2,6,3,“ 1 + 2”,3)和 f(2,6,3,“ 1-2”,-1) 然后它将像这样继续下去,直到到达公式中包含6个数字的调用为止,然后它将检查结果是否为3。
希望可以帮助您入门。
,此代码示例应为您提供帮助。您可以根据您的需要调整此递归,因为它只计算此类组合的数量。
考虑到这种方法很慢,您可以找到一些速度更快的DP解决方案。
private static int Search(int start,int end,int cur,int searched)
{
if (start > end)
{
return Convert.ToInt32(cur == searched);
}
return Search(start + 1,end,cur + start,searched) + Search(start + 1,cur - start,searched);
}
static void Main(string[] args)
{
int result = Search(2,6,1,3);
}
,
此答案旨在成为无助的帮助中的顶峰。
要求什么。
因此,在这里,尽管您可能从未听说过完整的语言解决方案,但有些混淆。但是,如果您考虑了足够长的时间,就会发现如何使用C#解决这个问题。
data Expr = Lit Integer | Add | Sub deriving(Show)
compute :: [Expr] -> Integer -> Integer
compute [] value = value
compute (Add : Lit x : rest) value = compute rest (value + x)
compute (Sub : Lit x : rest) value = compute rest (value - x)
compute (Lit x1 : Add : Lit x2 : rest) value = compute rest (value + x1 + x2)
compute (Lit x1 : Sub : Lit x2 : rest) value = compute rest (value + x1 - x2)
compute [Lit x] _ = x
solve :: Integer -> [Integer] -> [Expr] -> [[Expr]] -> [[Expr]]
solve goal [] current found
| goal == compute current 0 = current : found
| otherwise = found
solve goal (n:ns) current found =
solve goal ns (current ++ [Add,Lit n]) []
++ solve goal ns (current ++ [Sub,Lit n]) []
prettyFormula :: [Expr] -> String
prettyFormula f =
concat $ fmap (\xp -> case xp of
Lit n -> show n
Add -> "+"
Sub -> "-") f
加载后,在REPL中使用fmap prettyFormula (solve 3 [2..6] [Lit 1] [])
,您将得到结果:
["1+2+3-4-5+6","1+2-3+4+5-6","1-2-3-4+5+6"]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。