Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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_Recursion - Fatal编程技术网

Ruby代码解释:使用递归将数字转换为字符串

Ruby代码解释:使用递归将数字转换为字符串,ruby,recursion,Ruby,Recursion,有人分享了一些Ruby代码,讲述了他们如何完成一项挑战,即必须将数字转换为单词。到目前为止,这个解决方案是最简单的,但我并不完全理解它的递归方面。具体来说,在下面的一行中 elsif int.to_s.length == 1 && int/num > 0 return str + "#{name}" 如果一个return语句将代码从循环中分离出来,那么一旦它为真,为什么这个代码不执行并分离循环呢?例如,当int=4和num=1时,这将被证明是真的并触发return语

有人分享了一些Ruby代码,讲述了他们如何完成一项挑战,即必须将数字转换为单词。到目前为止,这个解决方案是最简单的,但我并不完全理解它的递归方面。具体来说,在下面的一行中

elsif int.to_s.length == 1 && int/num > 0
  return str + "#{name}" 
如果一个return语句将代码从循环中分离出来,那么一旦它为真,为什么这个代码不执行并分离循环呢?例如,当int=4和num=1时,这将被证明是真的并触发return语句,但代码将一直持续到num=4

对代码这一方面的任何澄清,以及理解此解决方案的任何一般性建议,都会有所帮助。仍在努力理解递归。谢谢

def in_words(int)
  numbers_to_name = {
      1000000 => "million",
      1000 => "thousand",
      100 => "hundred",
      90 => "ninety",
      80 => "eighty",
      70 => "seventy",
      60 => "sixty",
      50 => "fifty",
      40 => "forty",
      30 => "thirty",
      20 => "twenty",
      19=>"nineteen",
      18=>"eighteen",
      17=>"seventeen", 
      16=>"sixteen",
      15=>"fifteen",
      14=>"fourteen",
      13=>"thirteen",              
      12=>"twelve",
      11 => "eleven",
      10 => "ten",
      9 => "nine",
      8 => "eight",
      7 => "seven",
      6 => "six",
      5 => "five",
      4 => "four",
      3 => "three",
      2 => "two",
      1 => "one"
    }

  str = ""
  numbers_to_name.each do |num, name|
    if int == 0
      return str
    elsif int.to_s.length == 1 && int/num > 0
      return str + "#{name}"      
    elsif int < 100 && int/num > 0
      return str + "#{name}" if int%num == 0
      return str + "#{name} " + in_words(int%num)
    elsif int/num > 0
      return str + in_words(int/num) + " #{name} " + in_words(int%num)
    end
  end
end

puts in_words(4) == "four"
puts in_words(27) == "twenty seven"
puts in_words(102) == "one hundred two"
puts in_words(38_079) == "thirty eight thousand seventy nine"
puts in_words(82102713) == "eighty two million one hundred two thousand seven hundred thirteen"
def in_words(int)
编号到名称={
1000000=>“百万”,
1000=>“千”,
100=>“100”,
90=>“90”,
80=>“80”,
70=>“70”,
60=>“六十”,
50=>“50”,
40=>“40”,
30=>“30”,
20=>“二十”,
19=>“十九”,
18=>“18”,
17=>“17”,
16=>“16”,
15=>“十五”,
14=>“14”,
13=>“十三”,
12=>“12”,
11=>“11”,
10=>“十”,
9=>“九”,
8=>“八”,
7=>“七”,
6=>“六”,
5=>“五”,
4=>“四”,
3=>“三”,
2=>“两个”,
1=>“一”
}
str=“”
数字到名称。每个do |数字,名称|
如果int==0
返回str
elsif int.to_.length==1&&int/num>0
返回str+“#{name}”
elsif int<100&&int/num>0
如果int%num==0,则返回str+“#{name}”
返回str+“#{name}”+(int%num)
elsif int/num>0
返回str+in_words(int/num)+“{name}”+in_words(int%num)
结束
结束
结束
放入单词(4)=“四”
放入单词(27)=“二十七”
放入单词(102)=“102”
放入单词(38_079)=“三万八千七百九十九”
放入单词(82102713)=“八千二百一十二万二千七百一十三”
调试代码 下面是一个修改版本,每个分支中都有调试行:

def in_words(int, indent="")
  puts "#{indent}in_words(#{int})"
  numbers_to_name = {
      1000000 => "million",
      1000 => "thousand",
      100 => "hundred",
      90 => "ninety",
      80 => "eighty",
      70 => "seventy",
      60 => "sixty",
      50 => "fifty",
      40 => "forty",
      30 => "thirty",
      20 => "twenty",
      19=>"nineteen",
      18=>"eighteen",
      17=>"seventeen", 
      16=>"sixteen",
      15=>"fifteen",
      14=>"fourteen",
      13=>"thirteen",              
      12=>"twelve",
      11 => "eleven",
      10 => "ten",
      9 => "nine",
      8 => "eight",
      7 => "seven",
      6 => "six",
      5 => "five",
      4 => "four",
      3 => "three",
      2 => "two",
      1 => "one"
    }

  str = ""
  numbers_to_name.each do |num, name|
    puts "#{indent}  testing #{num}"
    if int == 0
      puts "#{indent}   Empty string"
      return str
    elsif int.to_s.length == 1 && int/num > 0
      puts "#{indent}  Single digit found (#{name})!"
      return str + "#{name}"      
    elsif int < 100 && int/num > 0
      puts "#{indent}  Double digits found (#{name})!"
      return str + "#{name}" if int%num == 0
      puts "#{indent}  Recursive call with #{int%num} :"
      return str + "#{name} " + in_words(int%num, indent+"  ")
    elsif int/num > 0
      puts "#{indent}  Recursive call with #{int/num} and #{int%num} :"
      indent += "  "
      return str + in_words(int/num, indent) + " #{name} " + in_words(int%num,indent)
    end
  end
end
27人:

in_words(27)
  testing 1000000
  testing 1000
  testing 100
  testing 90
  testing 80
  testing 70
  testing 60
  testing 50
  testing 40
  testing 30
  testing 20
  Double digits found (twenty)!
  Recursive call with 7 :
  in_words(7)
    testing 1000000
    testing 1000
    testing 100
    testing 90
    testing 80
    testing 70
    testing 60
    testing 50
    testing 40
    testing 30
    testing 20
    testing 19
    testing 18
    testing 17
    testing 16
    testing 15
    testing 14
    testing 13
    testing 12
    testing 11
    testing 10
    testing 9
    testing 8
    testing 7
    Single digit found (seven)!
twenty seven
答复 例如,当int=4和num=1时,这将被证明是正确的 触发return语句,但代码将一直持续到num=4

使用
4
作为输入,
num=1
将永远不会发生
numbers\u to\u name
是按降序排列的,因此返回语句将出现在
num=4
中,之后该方法将不会执行任何其他代码。

Ahh--谢谢!我现在意识到,每个循环都是从顶部开始的——数百万——向下。我的疏忽太严重了。谢谢你花时间给我看!!
in_words(27)
  testing 1000000
  testing 1000
  testing 100
  testing 90
  testing 80
  testing 70
  testing 60
  testing 50
  testing 40
  testing 30
  testing 20
  Double digits found (twenty)!
  Recursive call with 7 :
  in_words(7)
    testing 1000000
    testing 1000
    testing 100
    testing 90
    testing 80
    testing 70
    testing 60
    testing 50
    testing 40
    testing 30
    testing 20
    testing 19
    testing 18
    testing 17
    testing 16
    testing 15
    testing 14
    testing 13
    testing 12
    testing 11
    testing 10
    testing 9
    testing 8
    testing 7
    Single digit found (seven)!
twenty seven