我正在从旧的试卷上做这个问题,以提高我的红宝石编程技巧 . 我在第2部分遇到了一些问题.Seq_gen_b - >使用 recursion 生成序列 . 以下是问题本身 .
基本上它要求通过取值n,乘以2并取走3来生成一系列数字 . 然后使用这个新数字生成下一个数字 . 这些数字将存储在一个数组中 . 我的问题是我想不出一个阻止递归发生的好方法 .
创建两个方法 - seq_gen_a和seq_gen_b - 每个方法将取一个数字n(大于2),并生成一个包含四个元素的数组,其第一个元素是n,接下来的三个元素是序列中的三个数字将之前的数字加倍,从中获得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
任何帮助都非常感谢,并提前感谢
4 回答
在进行递归调用之前,所有方法需求都是实际停止条件:
因为你应该再做3个对象,所以只需使用一个简单的计数器就可以确定你是否处于正确的数量,然后返回 .
就个人而言,我认为这两种设计都不是很好 . 生成序列,并选择从中获取多少元素,是两个非常不同的问题,不应该在单个方法中混淆 .
为了生成序列,Ruby已经有了
Enumerator
类:我将两个不同的关注点分成两个不同的方法,一个返回生成器,另一个选择要采用的元素 . 并且
Enumerator
混合在Enumerable
中,因此我们也可以使用所有这些方法,包括take
. 这意味着我们已经为我们编写了选择要采用多少元素的方法 . 多好! (当你使用适当的抽象时会发生这种情况 . )我认为使用单个方法是最干净的,理想情况下使用可选参数 . 我的解决方案如下:
这是你可以做到的一种方式:
[*n]
如果n
是数组则返回n
,如果n
是整数,则返回[n]
.nil
只是一个占位符;任何 Value 都可以 .