在VB.net中使用递归函数

  • 本文关键字:递归函数 VB net vb.net
  • 更新时间 :
  • 英文 :


我在MSDN文档中找到了这段代码作为递归函数的示例:下面提供了链接:

https://learn.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/procedures/recursive-procedures

Function Factorial(n As Integer) As Integer ......'statement 1
If n <= 1 Then
Return 1
End If
**Return Factorial(n - 1) * n** 'Statement II: Not understanding how this helps calculating the factorial
End Function

虽然我确实理解递归函数是如何工作的,但我不理解语句II是如何计算阶乘的。例如,假设我们在第一步中输入n=5。然后,根据我的理解,语句IIReturn **Factorial(n - 1)**的第一部分将调用语句I中的阶乘函数,并发送参数n-1=4。这就是我的第一个问题:当我们从语句II调用语句I中的阶乘函数,并传递等于4的参数(n-1(时,我们也将其乘以n……我们在语句II中到底返回了什么。。。?换句话说,有人能一步一步地解释阶乘值是如何计算的吗?

此外,我还尝试使用这段代码来编写完整的程序,但不幸的是,我无法使其工作。为了使它发挥作用,我必须在Factorial函数中引入第二个参数——一个实际存储计算值的参数。我提供了以下代码。我的第二个问题是:有可能简化我写的代码吗。。。其思想是不使用第二参数"0";事实;。。。这可能吗?

我写的代码如下:

Module Module1
Sub Main()
Dim number As Integer
Dim fact As Integer = 1
Console.Write("Please enter number: ")
number = Console.ReadLine()
Factorial(number, fact)
Console.ReadLine()
End Sub
Function Factorial(ByVal n As Integer, ByVal fact As Integer) As Integer
If n > 0 Then
Console.WriteLine("Current Value of n = {0}", n)
End If
If n < 1 Then
Console.WriteLine("Factorial = {0}", fact)
Return 1
End If
fact = fact * n
Return Factorial(n - 1, fact)
End Function
End Module

给定递归函数:

Function Factorial(n As Integer) As Integer
If n <= 1 Then
Return 1
End If
Return Factorial(n - 1) * n
End Function

和一个值为5:的初始调用

Dim result As Integer = Factorial(5)

你会得到这样的序列:

Call    What gets returned
----    -----------------------
F(5)    Return Factorial(4) * 5
F(4)    Return Factorial(3) * 4
F(3)    Return Factorial(2) * 3
F(2)    Return Factorial(1) * 2
F(1)    Return 1

当我们到达F(1(时,我们返回一个1,然后我们";展开";并在调用链上向后移动,将返回值代入递归调用所在的前一行。在展开期间的每个点,将计算(并返回(一个新的整数值,直到我们最终得到由原始递归调用返回并分配给"的最终答案;结果";变量:

Return 1
Return 2 ' 1 * 2
Return 6 ' 2 * 3
Return 24 ' 6 * 4
Return 120 ' 24 * 5

如果您只是对学习递归如何工作感兴趣,那么Idle_Mind的答案很好。然而,如果你只想计算一个数字的阶乘,这要简单得多:

Dim Factorial As Integer = 1
For i As Integer = 1 To N
Factorial *= i
Next

其中N是需要阶乘的数。

最新更新