Use a recursive method to calculate the sum of all integers from 1 to n.
An ArgumentError should be raised if the input is below 1.
def sum n raise ArgumentError('n must be greater than 0') if n < 1 n == 1 ? 1 : n + sum(n - 1) end
1 1 def sum n
2 − return 1 if n == 1 # Base case of recursion method - must be defined; otherwise infinite recursion may occur
3 − n + sum(n - 1)
2 + raise ArgumentError('n must be greater than 0') if n < 1
3 + n == 1 ? 1 : n + sum(n - 1)
4 4 end
describe "The function" do it "should sum up to 10 correctly" do Test.assert_equals sum(1), 1 Test.assert_equals sum(2), 3 Test.assert_equals sum(3), 6 Test.assert_equals sum(4), 10 Test.assert_equals sum(5), 15 Test.assert_equals sum(6), 21 Test.assert_equals sum(7), 28 Test.assert_equals sum(8), 36 Test.assert_equals sum(9), 45 Test.assert_equals sum(10), 55 end it "should sum up to larger numbers correctly too" do Test.assert_equals sum(20), 210 Test.assert_equals sum(30), 465 Test.assert_equals sum(40), 820 Test.assert_equals sum(50), 50 * (50 + 1) / 2 end it "should sum up to any number correctly" do 5.times do rand_int = Test.random_number Test.assert_equals sum(rand_int), rand_int * (rand_int + 1) / 2 end end it "should raise an argument error if n < 1" do Test.expect_error(ArgumentError) { sum(0) } Test.expect_error(ArgumentError) { sum(-100) } end end
… Expand 1 1 describe "The function" do
2 2 it "should sum up to 10 correctly" do
3 3 Test.assert_equals sum(1), 1
4 4 Test.assert_equals sum(2), 3
5 5 Test.assert_equals sum(3), 6
6 6 Test.assert_equals sum(4), 10
7 7 Test.assert_equals sum(5), 15
8 8 Test.assert_equals sum(6), 21
9 9 Test.assert_equals sum(7), 28
10 10 Test.assert_equals sum(8), 36
11 11 Test.assert_equals sum(9), 45
12 12 Test.assert_equals sum(10), 55
13 13 end
14 14 it "should sum up to larger numbers correctly too" do
15 15 Test.assert_equals sum(20), 210
16 16 Test.assert_equals sum(30), 465
17 17 Test.assert_equals sum(40), 820
18 18 Test.assert_equals sum(50), 50 * (50 + 1) / 2
19 19 end
20 20 it "should sum up to any number correctly" do
21 21 5.times do
22 22 rand_int = Test.random_number
23 23 Test.assert_equals sum(rand_int), rand_int * (rand_int + 1) / 2
24 24 end
25 25 end
26 + it "should raise an argument error if n < 1" do
27 + Test.expect_error(ArgumentError) { sum(0) }
28 + Test.expect_error(ArgumentError) { sum(-100) }
29 + end
26 26 end