2016-12-08 51 views
-1

我是Ruby的初学者,我不明白这段代码在做什么,请问你能向我解释一下吗?我不明白这个方法

def a(n) 
    s = 0 
    for i in 0..n-1 
    s += i 
    end 
    s 
end 
+1

总计从0到n的数字。 – ndn

+1

*并返回 – DZDomi

+2

我认为这不是惯用的。 –

回答

1

方法A(N)计算第一Ñ自然数的总和。

: 当n = 4时,则s = 0 + 1 + 2 + 3 = 6

4

def定义的方法。可以使用方法在不同的值上运行相同的代码。例如,假设你希望得到一个数的平方:

def square(n) 
    n * n 
end 

现在我能做到这一点有不同的价值观和我不必重复n * n

square(1) # => 1 
square(2) # => 4 
square(3) # => 9 

=是一项任务。

s = 0基本上说,后面的名字s,现在有


0..n-1 - 构造一个包含0n - 1之间的所有数字的范围。例如:

puts (0..3).to_a 
    # 0 
    # 1 
    # 2 
    # 3 

for分配i该范围的每个连续值。它遍历所有值。所以首先i0,然后1,然后...... n - 1


s += is = s + i的简写。换句话说,在每次迭代中将s的现有值递增i


s末只是说,该方法(还记得我们有def打开的东西)会给你回s值。换句话说 - 我们迄今积累的总和。


有5分钟的编程课。

+1

干得好。作为一个孩子,我记得'n = n + 1'并且想着'等等,什么?这是不可能的!' –

1

由于您是Ruby的初学者,我们从小片开始。

0..n-1 => [0,n-1]。例如。 0..3 => 0,1,2,3 => [0,3]

for i in 0.. n-1 =>这是for循环。 i遍历[0,n-1]。

s += i是相同s = s + i

大二方法a(n)然后初始化s = 0在for循环我遍历[0,N - 1]和s = s + i

在该方法结束时有一个s。 Ruby忽略关键字return。这样你就可以把它看作return s

def a(n) 
    s = 0 
    for i in 0..n-1 
    s += i 
    end 
    s 
end 

是相同

def a(n) 
    s = 0 
    for i in 0..n-1 
    s = s + i 
    end 
    return s 
end 

a(4) = 0 + 1 + 2 + 3 = 6

希望这是很有帮助的。

2

本示例不是惯用的Ruby代码,即使它在语法上有效。 Ruby很少使用for构造,迭代器更加灵活。如果您来自其他语言背景,那么for是许多程序的支柱,这可能看起来很奇怪。

在任何情况下,节目打破了这个:

# Define a method called a which takes an argument n 
def a(n) 
    # Assign 0 to the local variable s 
    s = 0 

    # For each value i in the range 0 through n minus one... 
    for i in 0..n-1 
    # ...add that value to s. 
    s += i 
    end 

    # The result of this method is s, the sum of those values. 
    s 
end 

表达这种的更红宝石的方法是使用times

def a(n) 
    s = 0 

    # Repeat this block n times, and in each iteration i will represent 
    # a value in the range 0 to n-1 in order. 
    n.times do |i| 
    s += i 
    end 

    s 
end 

这只是解决for问题。代码已经更具可读性了,请介意,它在那里n.times做些什么do ... end块表示用于每次迭代的一块代码块。 Ruby块最初可能有些困惑,但理解它们对于在Ruby中有效是绝对必要的。

考虑这一步:

def a(n) 
    # For each element i in the range 0 to n-1... 
    (0..n-1).reduce |sum, i| 
    # ...add i to the sum and use that as the sum in the next round. 
    sum + i 
    end 
end 

reduce方法是用Ruby的简单工具,如果有效地利用这是相当有力的。它允许你快速浏览事物清单并将其压缩到一个单一的值,因此名称。它也被称为inject,它只是同一事物的别名。

您也可以使用简写本:

def a(n) 
    # For each element in the range 0 to n-1, combine them with + 
    # and return that as the result of this method. 
    (0..n-1).reduce(&:+) 
end 

这里哪里是&:+简写{ |a,b| a + b },就像&:x将简称{ |a,b| a.x(b) }

0

让我们按符号去符号!

def a(n) 

这是一个功能def从头开始,而你定义一个接受一个参数,n功能a - 所有典型的软件的东西。值得注意的是,你可以def国家统计局对其他事物的功能,太:

foo = "foo" 
def foo.bar 
    "bar" 
end 
foo.bar() # "bar" 
"foo".bar # NoMethodError 

下一行:

s = 0 

在这一行,你们都在声明变量s,并设置它的初始值0。也是典型的编程材料。

值得注意的是,整个表达式的值为; s = 0,为s的分配后的值:

s = 0 
r = t = s += 1 # You can think: r = (t = (s += 1)) 
# r and t are now 1 

下一行:

for i in 0..n-1 

这是开始一个循环;特别是一个for ... in ...循环。这个有点难以解开,但是整个陈述基本上是:“对于0n-1之间的每个整数,将该数字分配给i,然后执行某些操作”。实际上,在Ruby中,另一种写这行的方法是:

(0..n-1).each do |i| 

这行和你的行完全一样。

对于单行循环,您可以使用{}代替doend

(0..n-1).each{|i| s += i } 

这条线,你的for回路是完全一样的。

(0..n-1)range。范围非常有趣!你可以用很多东西来弥补一个范围,特别是时间:

(Time.now..Time.new(2017, 1, 1)) # Now, until Jan 1st in 2017 

你也可以改变“步长”,以便不用每一个整数,它的,也就是说,每1/10:

(0..5).step(0.1).to_a # [0.0, 0.1, 0.2, ...] 

此外,您还可以使范围中排除的最后一个值:

(0..5).to_a # [0, 1, 2, 3, 4, 5] 
(0...5).to_a # [0, 1, 2, 3, 4] 

下一页线!

s += i 

通常朗读“plus-equals”。它的字面意思与s = s + 1相同。据我所知,在Ruby中,几乎每个运营商可以配对了这种方式:

s = 5 
s -= 2 # 3 
s *= 4 # 12 
s /= 2 # 6 
s %= 4 # 2 
# etc 

最后几行(我们将它们作为一组):

end 
    s 
end 

的“块”(代码组)那是由deffor开始的需要end ed,这就是你在这里做的。

但也!

Ruby中的所有内容都有一个值。每个表达式都有一个值(包括赋值,就像你在第2行看到的那样)和每个代码块。 块的默认值是该块中最后一个表达式的值。

对于你的函数,最后一个表达式只是s,所以表达式的值是s的值,毕竟是说完成了。这是字面上相同的:

return s 
end 

对于循环,它是怪胎 - 它最终是评估范围。

这个例子可能更清楚:

n = 5 
s = 0 
x = for i in (0..n-1) 
    s += i 
end 
# x is (0..4) 

总括来说,另一种方式来写你的功能是:

def a(n) 
    s = 0 
    (0..n-1).each{ |i| s = s + i } 
    return s 
end 

问题?