Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby中的递归字符串修改_Ruby_String - Fatal编程技术网

Ruby中的递归字符串修改

Ruby中的递归字符串修改,ruby,string,Ruby,String,我有一根绳子。我需要把每一行倒转一次。如果计数为2,则应显示: "Hola mi amigo \nogima im aloH" "Hola mi amigo \nogima im aloH \nHola mi amigo" 如果计数为3,则应显示: "Hola mi amigo \nogima im aloH" "Hola mi amigo \nogima im aloH \nHola mi amigo" 等等。每隔一段时间执行字符串修改的最短方法是什么\n 我的直觉是使用正则表达式。除

我有一根绳子。我需要把每一行倒转一次。如果计数为2,则应显示:

"Hola mi amigo \nogima im aloH"
"Hola mi amigo \nogima im aloH \nHola mi amigo"
如果计数为3,则应显示:

"Hola mi amigo \nogima im aloH"
"Hola mi amigo \nogima im aloH \nHola mi amigo"
等等。每隔一段时间执行字符串修改的最短方法是什么\n

我的直觉是使用正则表达式。除了正则表达式解决方案外,还有任何非正则表达式解决方案吗?我想把两者都比较一下

def hola(count) 
  if COUNT IS LESS THAN 2
    return false
  elsif ODD
    (("Hola mi amigo ")*((count-1)/2) + "\n") * count 
  elsif EVEN
    (("Hola mi amigo ")*(count/2) + "\n") * count 
  end 
end

如果实现中没有限制,请尝试以下操作:

string = "Hola mi amigo"
reversed_string = string.reverse
count.times.map { |i| i.odd? ? reversed_string : string }.join "\n"
times.map将创建一个枚举器。下一个块将检查当前索引是奇数还是偶数;在第一种情况下,它将反转字符串并返回它。最后,所有字符串通过换行连接在一起

此外,这里还有另一个可能效率较低的递归解决方案:

def hola(count)
  if count == 0
    ''
  elsif count.even?
    "Hola mi amigo".reverse + "\n" + hola(count - 1)
  else
    "Hola mi amigo" + "\n" + hola(count - 1)
  end
end

我对Ruby没有特别的经验,但从一些简单的搜索中,我会使用.reverse方法,并在elsif语句中使用for循环。把它组合起来应该不会太难

可以在此处找到一些反向文档:

只是出于好奇:

str = '¡Hola mi amigo!'
([str, str.reverse] * (count / 2 + 1)).take(count).join $/
([str] * count).map.with_index { |s, i| i.even? ? s : s.reverse }.join $/
([str] * count).each.with_index.with_object("") do |(s, i), acc|
  acc << (i.even? ? s : s.reverse) << $/
end.strip
为了使Cary更可靠,可以提前准备反向字符串。

解决方案1 我很惊讶没有其他人提出解决方案,也许@CarySwoveland正在度假:

def hola(str, count) 
  [ str, str.reverse ].cycle.take(count).join("\n")
end

puts hola("Hola mi amigo", 1)
# => Hola mi amigo

puts hola("Hola mi amigo", 2)
# => Hola mi amigo
#    ogima im aloH

puts hola("Hola mi amigo", 3)
# => Hola mi amigo
#    ogima im aloH
#    Hola mi amigo

puts hola("Hola mi amigo", 8)
# => Hola mi amigo
#    ogima im aloH
#    Hola mi amigo
#    ogima im aloH
#    Hola mi amigo
#    ogima im aloH
#    Hola mi amigo
#    ogima im aloH
解决方案2 我突然想到,OP实际上是在寻找一个递归解决方案,正如他们在标题中所写:

def hola(str, count)
  return "" if count <= 0
  str + "\n" + hola(str.reverse, count - 1).chomp
end

输出同上。显然,它没有那么有效,但在其他方面我更喜欢它。

@sawacount在holacount中是用户输入的变量,一个整数。如果计数是。。。是代码在人类语言中的预期用途,而不是实际编写实际代码;i、 e.:lazness.Iggy,@sawa说,请编辑你的问题来定义计数。当出现问题时,最好编辑您的问题,而不是试图在评论中回答。不是每个人都读评论,也不是每个人都应该读评论。问题应该是自包含的。这在同一个字符串中有很多反转。@CarySwoveland是的,还有更多不必要的中间对象。原因是要展示不同的方法。我总是在回答之前加上一句“出于好奇”的免责声明,这样的话就不会用了。谢谢修正了。既然OP请求的结果没有拖尾回车,那么它不应该把end.chomp作为最后一行吗?捕捉得好,@mudasobwa。我已经编辑了我的答案。这个编辑不会起作用。但是,它确实有效。
def alternate(str, count)
  (("%s\n%s\n" % [str, str.reverse])*(count/2) << str*(count % 2)).chomp
end

str = "Hola mi amigo"

puts alternate(str, 4)  
Hola mi amigo
ogima im aloH
Hola mi amigo
ogima im aloH

puts alternate(str, 5)  
Hola mi amigo
ogima im aloH
Hola mi amigo
ogima im aloH
Hola mi amigo