首页 > 解决方案 > 在递归函数中间做一些事情,然后根据需要返回

问题描述

如何在递归过程中做某事,并根据需要返回?换句话说,也许不再需要递归,因为我找到了一个“解决方案”,在这种情况下为了节省资源,递归可以停止。

例如,假设我有一个工作permute方法可以做到这一点

permute([["a","b"],[1,2]])
>>> [["a", 1], ["a", 2], ["b", 1], ["b", 2]]

如果一个满足我的要求,我希望它停止,而不是让该方法产生所有 4 种可能性。例如,假设我正在搜索["a",2],则该方法可以在创建第二种可能性后停止。

这是我目前permute正在使用的方法

def permute(arr)
  if arr.length == 1
    return arr.first
  else
    first = arr.shift
    return first.product(permute(arr)).uniq 
  end
end

我觉得我需要在do某个地方注入一个类似下面的块,但不确定如何/在哪里......

if result_of_permutation_currently == ["a",2]
   return ...
else
   # continuing the permutations
end

标签: rubyrecursion

解决方案


您可以按如下方式编写方法。

def partial_product(arr, last_element)
  @a = []
  @last_element = last_element
  recurse(arr)
  @a
end

def recurse(arr, element = [])
  first, *rest = arr
  if rest.empty?
    first.each do |e|
      el = element + [e]
      @a << el
      return true if el == @last_element
    end
  else
    first.each do |e|
      rv = recurse(rest, element + [e])
      return true if rv
    end
  end
  false
end

arr = [["a","b"], [1,2,3], ["cat","dog"]]

partial_product(arr, ["b",2,"dog"])
  #=> [["a", 1, "cat"], ["a", 1, "dog"], ["a", 2, "cat"],
  #    ["a", 2, "dog"], ["a", 3, "cat"], ["a", 3, "dog"],
  #    ["b", 1, "cat"], ["b", 1, "dog"], ["b", 2, "cat"],
  #    ["b", 2, "dog"]]
partial_product(arr, ["a",1,"dog"])
  #=> [["a", 1, "cat"], ["a", 1, "dog"]] 
partial_product(arr, ["b",2,"pig"])
  #=> [["a", 1, "cat"], ["a", 1, "dog"], ["a", 2, "cat"],
  #    ["a", 2, "dog"], ["a", 3, "cat"], ["a", 3, "dog"],
  #    ["b", 1, "cat"], ["b", 1, "dog"], ["b", 2, "cat"],
  #    ["b", 2, "dog"], ["b", 3, "cat"], ["b", 3, "dog"]] 

如果您希望避免使用实例变量,您可以在 中携带alast_element作为参数recurse,但这样做会导致效率低下,尤其是在内存使用方面。


推荐阅读