Ruby中数字序列的生成

Ruby中数字序列的生成,ruby,recursion,Ruby,Recursion,我做这道题是为了复习我的ruby编程技能。我对第二部分有些问题。Seq_gen_b->使用递归生成序列。下面是问题本身 基本上,它要求生成一个数字序列,取一个值n,乘以2,再减去3。然后使用这个新号码生成下一个号码。这些数字将存储在一个数组中。我的问题是,我想不出一个好方法来阻止递归的发生 创建两种方法–seq_gen_a和seq_gen_b–每种方法都将 取一个n大于2的数字,生成一个4的数组 元素,其第一个元素为n,接下来的三个元素为3 将上一个数字加倍并取3的序列中的数字 从中;这样,i

我做这道题是为了复习我的ruby编程技能。我对第二部分有些问题。Seq_gen_b->使用递归生成序列。下面是问题本身

基本上,它要求生成一个数字序列,取一个值n,乘以2,再减去3。然后使用这个新号码生成下一个号码。这些数字将存储在一个数组中。我的问题是,我想不出一个好方法来阻止递归的发生

创建两种方法–seq_gen_a和seq_gen_b–每种方法都将 取一个n大于2的数字,生成一个4的数组 元素,其第一个元素为n,接下来的三个元素为3 将上一个数字加倍并取3的序列中的数字 从中;这样,i seq_gen_a使用 迭代,然后ii seq_gen_b使用递归生成序列。 例如,给定数字5,这两种方法都将输出: [5,7,11,19]尽管如此,很明显,他们将在年内实现这一产出 不同的方式

这是我到目前为止所拥有的,但我不知道如何阻止它的内存不足。可能完全错了

def seq_gen_b(n)
  if n < 2
     n
  else
   (0..2).each do |i|
    num = ((n * 2) -3)
   seq_gen_b(num)
   end
  end
end

非常感谢您的帮助并提前感谢

在进行递归调用之前,您的方法所需的只是内部的实际停止条件:

def seq_gen_b(n)
  result = [n]
  seq_gen_b_helper(n, result, 3)
end

def seq_gen_b_helper(n, result, count)
  if count != 0
    value = ((n * 2) - 3)
    result << value
    seq_gen_b_helper(value, result, count - 1)
  else
    result
  end
end

由于您需要处理3个以上的对象,只需使用一个简单的计数器来确定您的计数是否正确,然后返回。

我认为使用单个方法是最干净的,最好使用一个可选参数。我的解决方案如下所示:

def seq_gen_b(n, result=[])
  return result if result.count >=4
  result << n
  seq_gen_b((n*2)-3, result)
end

就我个人而言,我认为这两种设计都不是很好。生成序列和选择从中提取多少元素是两个截然不同的问题,不应该在一个方法中混淆

为了生成序列,Ruby已经具有枚举器类:


这里有一种方法可以做到:

def seq_gen_b(n, a=[*n])
  a.size==4 ? a : seq_gen_b(nil, a << a.last*2-3)
end

seq_gen_b(5)
  #=> [5, 7, 11, 19]

[*n]如果n是数组,则返回n;如果n是整数,则返回n。nil只是一个占位符;任何价值都可以。

Jörg,我最近遇到了很多白痴,他们不明白分离关注点有多么重要。。。我是说在计算机科学杂志上。为什么你的答案不是公认的答案?他们为什么不给你更多的选票呢?这是一个很好的思想食粮!写def-seqfirst,size-Enumerator.new&yieldfirst.takesize-end,这里调用了seq5,4{n}->y{loop{y[5,7,11,19]?这可以不用在块中放入进程来写吗?为什么要匆忙选择答案?对于seq_gen_a:3.次。使用{n]{u object a,a{
def seq_gen(n) Enumerator.new do |y| loop do y << n; n = 2*n - 3 end end end

def seq_5_take_4; seq_gen(5).take(4) end

seq_5_take_4
# => [5, 7, 11, 19]
def seq_gen_b(n, a=[*n])
  a.size==4 ? a : seq_gen_b(nil, a << a.last*2-3)
end

seq_gen_b(5)
  #=> [5, 7, 11, 19]