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

如何使用递归在ruby中重新实现map方法?,ruby,recursion,Ruby,Recursion,我是一个ruby新手,正在学习编码。我想了解模块中可用的一些方法是如何工作的。所以我正在重新实现它们。一个挑战是使用递归实现它们。然而,我在尝试使用递归实现该方法时遇到了一个问题 这是我的代码: class Array def mymap_recursive(&block) copy_of_array = dup new_array = [] return new_array if copy_of_array.empty? value = copy_o

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

这是我的代码:

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
在方法的末尾。然后在崇高的文本中,我做到了

arr = [2,2,5,5,10]
arr.mymap_recursive {|n| n * n}
按cmd+b后,我得到的输出是:

[100]
[25]
[25]
[4]
[4]
我不明白为什么它不返回一个包含所有值的数组


谢谢你的帮助

每次调用
mymap\u recursive(&block)
时,代码中发生的事情都会丢失
新数组。要解决这个问题,您必须有一种方法来维护递归构建的新数组。对代码的一个简单更改是在方法定义中包含
new\u 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

如果你对这个语法有任何疑问,请告诉我,我会尽力解释

另一种不改变方法签名且不改变任何数据的解决方案:

class Array
  def mymap_recursive(&block)
    if empty?
      []
    else
      [block.call(first)] + drop(1).mymap_recursive(&block)
    end
  end
end

如果数组的副本为空,则在第3行中返回新的_数组(即[])。在哪里返回它以及其他内容?对我来说,第3行表示基本情况,如果条件为真,递归应该中断。我想它只会返回一个包含所有值的新数组。是的,这是基本情况。。。它只会返回一个新的数组,其中没有任何内容。。因为在你给它赋值[]之后,它就有了这个东西……;)您还必须有一个案例,返回新的_数组,其中包含一些内容感谢您的帮助!但是我对这个方法有一个疑问:第6行不是从调用mymap方法的原始数组中删除了一个元素吗?是的。但它也会在加号之前处理掉的元素。第6行执行两个任务,由加号分隔。在加号之前,它取数组的“第一个”元素,并对其调用块(在您的示例中为“n*n”)。在加号之后,它删除第一个元素(已经平方的元素),并将此方法应用于所有剩余元素。然后,+运算符连接两侧。
arr = [2,2,5,5,10]
p arr.mymap_recursive {|n| n * n}
#returns
#[4, 4, 25, 25, 100]
class Array
  def mymap_recursive(&block)
    if empty?
      []
    else
      [block.call(first)] + drop(1).mymap_recursive(&block)
    end
  end
end