ruby - 如何使用递归在 ruby​​ 中重新实现 map 方法?

标签 ruby recursion

我是 ruby 新手,正在学习编码。我想了解 Enumerable 中的一些方法如何可用模块工作。所以我正在重新实现它们。一个挑战是使用递归来实现它们。但是,我在尝试实现 Enumerable#Map 时遇到了问题使用递归的方法。

这是我的代码:

class Array
  def mymap_recursive(&block)
    copy_of_array = dup
    new_array = []
    return new_array if copy_of_array.empty?
    value = copy_of_array.shift
    new_array << yield(value)
    copy_of_array.mymap_recursive(&block)
  end
end

我想弄清楚为什么它不起作用,所以我放了

puts "#{new_array}"

在方法的最后。然后在 Sublime Text 中,我做了

arr = [2,2,5,5,10]
arr.mymap_recursive {|n| n * n}

按下cmd+b后,我得到的输出是:

[100]
[25]
[25]
[4]
[4]

我不明白为什么它不返回一个包含所有值的数组。

感谢您的帮助!

最佳答案

您的代码中发生的情况是,每次您调用 mymap_recursive(&block) 时,new_array 都会丢失。要解决这个问题,您必须有一种方法来维护正在递归构建的新数组。对代码的一个简单更改是在方法定义中包含 new_array = [],然后每次都传递新数组。以下是我进行更改后的代码:

class Array
  def mymap_recursive(new_array = [], &block)
    copy_of_array = self.dup
    return new_array if copy_of_array.empty?
    value = copy_of_array.shift
    new_array << yield(value)
    copy_of_array.mymap_recursive(new_array, &block)
  end
end

然后当你调用

arr = [2,2,5,5,10]
p arr.mymap_recursive {|n| n * n}
#returns
#[4, 4, 25, 25, 100]

如果您对此语法有任何疑问或任何问题,请告诉我,我会尽力解释!

关于ruby - 如何使用递归在 ruby​​ 中重新实现 map 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30066217/

相关文章:

c - 如何有效地合并 Ruby C API 中的两个散列?

ruby-on-rails - Rails Mechanize 数据抓取查询/清理结果

c - 在递归函数中修改二维数组,C

python - 递归 Python 超时

c - 调用另一个递归函数的递归函数的运行时分析

javascript - 如果我在我所在的函数上调用 onload 事件,它是否考虑递归?

ruby - 自动更正库中的线长

javascript - 如何根据条件栏向表行添加类?

ruby - 如何找到json中所有单词的数组,可以通过重新排列这些字母(Ruby)

c - 为什么我在 C 中的递归函数会导致堆栈溢出?