Ruby 中的递归
函数直接或间接调用自身的过程称为递归,相应的函数称为递归函数。递归使这个过程更容易,它肯定会减少很多编译时间。在 Ruby 中,我们确实可以选择将所有操作放在一个循环中,以便它们可以重复给定次数。那么为什么需要递归呢?
由于在 Ruby 中,我们引入了现实生活中的变量,因此递归在解决 Ruby 中的主要现实生活问题中起着非常重要的作用。
简单代码:
在考虑对数组求和的一个非常简单的问题时,我们可以理解这些步骤。编写迭代代码意味着在数组中运行一个循环并将每个元素添加到一个变量中,然后返回该变量。
例子 :
Ruby
# Iterative program to execute the summing of a given array of numbers.
def iterativeSum(arrayofNumbers)
sum = 0
arrayofNumbers.each do |number|
sum += number
end
sum
end
iterativeSum([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
Ruby
# Recursive method to calculate the sum of all numbers in a given array.
def RecursiveSum(arrayofNumbers)
# Base Case: If the array is empty, return 0.
if arrayofNumbers?
return 0
# Recursive code: Adding each element to the variable by calling the method.
else
Sum = arrayofNumbers.pop
return Sum + RecursiveSum(arrayofNumbers)
end
end
RecursiveSum([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
Ruby
# Ruby code for calculating the factorial of a number recursively.
def RecursiveFactorial(number)
# Base Case:
if (0..1).include?(number)
return 1
end
#Recursive call:
number * RecursiveFactorial(number - 1)
end
# Calling the method:
RecursiveFactorial(6)
Ruby
# Ruby program for calculating the Nth Fibonacci number.
def Fibonacci(number)
# Base case : when N is less than 2.
if number < 2
number
else
# Recursive call : sum of last two Fibonacci's.
Fibonacci(number - 1) + Fibonacci(number - 2)
end
end
Fibonacci(3)
输出 :
55
编写递归代码:
在此代码中,该方法调用自身。在递归程序中,提供了基本情况的解决方案,并以较小的问题来表示较大问题的解决方案。
例子 :
红宝石
# Recursive method to calculate the sum of all numbers in a given array.
def RecursiveSum(arrayofNumbers)
# Base Case: If the array is empty, return 0.
if arrayofNumbers?
return 0
# Recursive code: Adding each element to the variable by calling the method.
else
Sum = arrayofNumbers.pop
return Sum + RecursiveSum(arrayofNumbers)
end
end
RecursiveSum([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
输出 :
55
可以使用另一个示例来理解如何实际执行递归步骤的概念。在下面的示例中,我们将执行一个简单的程序来查找给定数字的阶乘。
上述程序的代码如下:
例子 :
红宝石
# Ruby code for calculating the factorial of a number recursively.
def RecursiveFactorial(number)
# Base Case:
if (0..1).include?(number)
return 1
end
#Recursive call:
number * RecursiveFactorial(number - 1)
end
# Calling the method:
RecursiveFactorial(6)
输出 :
720
该代码的工作原理如下:
首先调用计算6 的阶乘的方法,该方法进一步调用计算5然后计算4的方法,直到达到调用 RecursiveFactorial(1) 并返回1作为答案的点。递归调用在这里起作用,因为它将每个调用的结果与已经存在的答案相乘。同样可以显示为以下步骤:
RecursiveFactorial(6) = 6 * RecursiveFactorial(5)
= 6 * 5 * RecursiveFactorial(4)
= 6 * 5 * 4 * RecursiveFactorial(3)
= 6 * 5 * 4 * 3 * RecursiveFactorial(2)
= 6 * 5 * 4 * 3 * 2 * RecursiveFactorial(1)
= 6 * 5 * 4 * 3 * 2 * 1
= 720
另一个例子是计算第N 个斐波那契数的代码。这里的基本情况是当 N 小于 2 时,斐波那契数就是它本身。递归调用将调用计算第 (n-1) 个和第 (n-2) 个斐波那契数的方法,并将其相加以获得第 N 个数的结果。
例子 :
红宝石
# Ruby program for calculating the Nth Fibonacci number.
def Fibonacci(number)
# Base case : when N is less than 2.
if number < 2
number
else
# Recursive call : sum of last two Fibonacci's.
Fibonacci(number - 1) + Fibonacci(number - 2)
end
end
Fibonacci(3)
输出 :
2
递归的概念解决了许多问题,并使过程变得更容易,就像通过迭代过程进行计算一样。因此,如果一个人掌握了递归的概念,就可以用更少的时间和更少的代码行数解决许多问题。但是,当使用大数字作为输入时,Ruby 中的递归有时会产生“SystemStackError: stack level too deep” (这个数字因系统而异)。这意味着我们必须使用迭代方法来解决涉及大量输入的问题。