ruby - 在递归函数中间做一些事情,然后根据需要返回
问题描述
如何在递归过程中做某事,并根据需要返回?换句话说,也许不再需要递归,因为我找到了一个“解决方案”,在这种情况下为了节省资源,递归可以停止。
例如,假设我有一个工作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
解决方案
您可以按如下方式编写方法。
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"]]
如果您希望避免使用实例变量,您可以在 中携带a
和last_element
作为参数recurse
,但这样做会导致效率低下,尤其是在内存使用方面。