给定一个数字,我的代码应返回1
和数字之间的所有偶数,并按以下格式打印:
22
4444
666666
etc...
这是到目前为止的代码:
def pattern(n)
n == 1 ? "" : arr = (1..n).select {|i| i if i % 2 == 0}.each {|item| return (item.to_s * item)}
end
如果任何数字大于4,则只会返回以下内容:
22
我认为这可能与块中的return
有关。但是,使用print
或puts
时,会返回单个数组元素,如下所示:
[2]
想一个解决这个问题的方法,以便我可以实现所需的输出?
答案 0 :(得分:2)
您的代码无法正常工作,因为它在达到第一个值时会返回。参见:
def pattern n
return "" if n == 1
(1..n).select { |i|
i if i % 2 == 0
}.each { |item|
return (item.to_s * item) # You are returning here!
}
end
作为建议,您可以将代码简化为:
def pattern n
(2..n).step(2) { |n| puts n.to_s * n }
end
或 - 甚至更好的IMO--你返回一个包含所有结果的数组,并让调用者决定如何处理它:
def pattern n
(2..n).step(2).map { |n| n.to_s * n }
end
答案 1 :(得分:2)
此代码可以解决您的问题:
def pattern(n)
n == 1 ? "" : arr = (1..n).select {|i| i if i % 2 == 0}.map {|item| (item.to_s * item)}
end
请注意,我使用map
代替each
,而我没有使用return
。 return
意味着你实际上没有完成对数字的循环...只要你从函数返回2
。
map
就是你想要的。
修改强>
多一点清理:
def pattern(n)
n == 1 ? "" : (1..n).select {|i| i.even?}.map {|item| item.to_s * item}
end
arr =
是不必要的。 select
中的阻止应该只返回true或false ...你也可以只使用i % 2 == 0
,但even?
恰好存在。此外,item.to_s * item
周围的括号是不必要的。
编辑2
根据下面的评论,如果你想要一个字符串,也许这就是你要找的东西(添加.join("\n")
):
def pattern(n)
n == 1 ? "" : (1..n).select {|i| i.even?}.map {|item| item.to_s * item}.join("\n")
end
编辑3
返回字符串时,您也可以跳过n==1
特殊情况,因为加入一个空数组只会返回一个空字符串:
def pattern(n)
(1..n).select {|i| i.even?}.map {|item| item.to_s * item}.join("\n")
end
答案 2 :(得分:0)
通过使用Integer#times
:
def pattern n
(2..n).each do |i|
next if i.odd?
i.times { print i }
puts
end
end
pattern 8
#=>
# 22
# 4444
# 666666
# 88888888