我不明白这个方法
回答
方法A(N)计算第一Ñ自然数的总和。
例: 当n = 4时,则s = 0 + 1 + 2 + 3 = 6
def
定义的方法。可以使用方法在不同的值上运行相同的代码。例如,假设你希望得到一个数的平方:
def square(n)
n * n
end
现在我能做到这一点有不同的价值观和我不必重复n * n
:
square(1) # => 1
square(2) # => 4
square(3) # => 9
=
是一项任务。
s = 0
基本上说,后面的名字s
,现在有零。
0..n-1
- 构造一个包含0
和n - 1
之间的所有数字的范围。例如:
puts (0..3).to_a
# 0
# 1
# 2
# 3
for
分配i
该范围的每个连续值。它遍历所有值。所以首先i
是0
,然后1
,然后...... n - 1
。
s += i
是s = s + i
的简写。换句话说,在每次迭代中将s
的现有值递增i
。
的s
末只是说,该方法(还记得我们有def
打开的东西)会给你回s
值。换句话说 - 我们迄今积累的总和。
有5分钟的编程课。
干得好。作为一个孩子,我记得'n = n + 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
希望这是很有帮助的。
本示例不是惯用的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) }
。
让我们按符号去符号!
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 ...
循环。这个有点难以解开,但是整个陈述基本上是:“对于0
和n-1
之间的每个整数,将该数字分配给i
,然后执行某些操作”。实际上,在Ruby中,另一种写这行的方法是:
(0..n-1).each do |i|
这行和你的行完全一样。
对于单行循环,您可以使用{
和}
代替do
和end
:
(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
的“块”(代码组)那是由def
和for
开始的需要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
问题?
- 1. 我不明白这种方法错误
- 2. 我不明白这个数组语法
- 3. 我不明白这个语法错误
- 4. Python:我不明白这个语法
- 5. 我不明白这个语法错误
- 6. 我不明白这个语法错误
- 7. 我不明白这个C++语法
- 8. 我不明白paintComponent方法
- 9. 我不明白这的RewriteCond
- 10. 。我不明白这一点
- 11. 我不明白这个性能问题
- 12. 我不明白这个功能(选件)
- 13. 我不明白这个的typedef
- 14. 我不明白这个错误haskell
- 15. 我不明白,这个错误
- 16. 我不明白这个代码
- 17. JAVA:我不明白这个NullPointerException
- 18. 我不明白这个Rails SyntaxError
- 19. 我不明白这个代码
- 20. 我不明白这个Java程序
- 21. 我不明白这个URI和更多
- 22. 我不明白这个ThreadPoolExecutor行为
- 23. 我不明白这个叉图()
- 24. 我不明白这个NullPointerException异常
- 25. 我不明白这个溢出行为
- 26. 我不明白这个循环
- 27. 对不起,我新,我不明白这
- 28. 不明白这个JS
- 29. 不明白Python方法
- 30. 不明白OpenSSL_add_all_algorithms方法
总计从0到n的数字。 – ndn
*并返回 – DZDomi
我认为这不是惯用的。 –