【问题标题】:How to solve a recursive Backtracking problem如何解决递归回溯问题
【发布时间】:2020-06-30 21:36:40
【问题描述】:

我有一个学校的递归回溯问题,我不明白该如何解决。

给定一个整数数组,确定是否有可能选择一组与特定总和相加的整数。使用称为sum_to_total 的递归方法来解决问题(没有循环!)。

例子:

  • “数组[3, 6, 7]”和“Sum 10”返回真,因为3 + 7 = 10
  • “数组[1, 2, 3]”和“Sum 6”返回真,因为1 + 2 + 3 = 6
  • “数组[2, 4, 6]”和“sum 5”返回false,因为这些数字的组合不等于5

这是我目前得到的:

def self.sum_to_total(sum, array, index)

  @@sum_num += array[index]
  return false if @@sum_num > sum || @@sum_num < sum
  return false if index<board.length || index<0
  return true if @@sum_num == sum

  return solvable(sum, array, index+1) 
end


@@sum_num = 0
puts sum_to_total(10, [3, 5, 7], 0)

一些建议会有所帮助。

【问题讨论】:

  • 当系统因为标题不好而阻止您提交问题时,请不要在其末尾添加“(Ruby)”以通过过滤器。这就是标签的用途。 *.com/help/how-to-ask 中有一个关于写标题的部分;我建议阅读它,然后回来并让您的问题标题更具描述性。
  • 欢迎来到 SO!请阅读“How do I ask and answer homework questions?”和“How do I format my posts...”以及“How do I format my code blocks?”。您要求我们努力帮助您;我们要求您努力提出一个问得很好的问题。语法和正确的格式对 SO 很重要。
  • 请阅读“MCVE”。您的代码不符合准则,因为未定义 solvable

标签: ruby recursion recursive-backtracking


【解决方案1】:

您已经对此有所了解,所以这里有一些可以帮助您前进的建议。

  1. “递归”是指调用自身的方法。您的solvable 需要致电sum_to_total
  2. 如果您必须在下一次调用时访问更新的值,递归方法需要传入在该方法期间发生更改的任何值。因此,index 是正确的,但您还必须传入 sum_num
  3. 您可以在第一次调用时使用默认值来初始化您的indexsum_num。你不需要弄乱全局变量。 (而且不应该。全局变量是邪恶的。大多数时候。)
  4. 您只想在遍历整个数组后返回。您不要在递归方法调用中使用return,您只需调用该方法。
  5. 您无需使用self.method_name 将其设为类方法。

我将向您展示基本的递归方法,并让您解决(更困难的)回溯要求。 (这个基本方法将解决整个数组加起来是否为和的情况。回溯部分是确定数组的一个子集是否是必要的。)

def sum_to_total(sum, array, index = 0, sum_num = 0)
  sum_num += array[index]
  return sum_num == sum if index == array.size - 1
  sum_to_total(sum, array, index + 1, sum_num)
end

三行代码就是这样做的:

  1. 将当前数组值加到总和中。 (你几乎可以接受这个。)
  2. 如果您完成了对数组的遍历,则返回数组的总和是否等于提供的总和值。
  3. (如果您还没有完成遍历数组)再次调用该方法,传入递增的索引值和到目前为止的累计值。 (你走在正确的轨道上!)

Here's 一篇可以帮助您完成回溯部分的文章。

【讨论】: