如何解决递归回溯问题

时间:2020-03-19 17:43:09

标签: ruby recursion recursive-backtracking

我在学校有一个递归回溯问题,我不知道该如何解决。

给出一个整数数组,确定是否可以选择一组加到特定总和上的整数。使用称为sum_to_total的递归方法来解决该问题(无循环!)。

示例:

  • “数组[3, 6, 7]”和“总和10”返回true,因为3 + 7 = 10
  • “数组[1, 2, 3]”和“和6”返回true,因为1 + 2 + 3 = 6
  • “数组[2, 4, 6]”和“和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)

一些指针会有所帮助。

1 个答案:

答案 0 :(得分:2)

您已经对此进行了尝试,因此这里有一些建议可以帮助您继续前进。

  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的一篇文章,应该可以帮助您进行回溯。

相关问题