【问题标题】:Recursive value in a function函数中的递归值
【发布时间】:2021-12-26 20:39:02
【问题描述】:

我正在尝试开发一个简单的基于类的函数,它将修改该函数确定的先前值,即它是递归关系。

本质上,我正在开发自己的随机数生成器,它的工作方式与当前 Random 类的工作方式相同,即

Dim ran as New Random(123456)
For i = 0 To 9
   MessageBox.Show(ran.NextDouble & "  " & ran.Next(1,11))
Next

我可以使用基于类的方法成功地做到这一点,只需发送一个值 ByRef,但正如您所知,对于方法调用,要修改的旧值需要放在对方法的调用中。因此,我试图克服对方法或全局类型变量的使用,而是希望实例化的类以某种方式记住当前值是什么。

下面的示例代码尝试在每次函数调用期间将值 _value 乘以 2,因此预期结果将是 2、4、8、16 等。但是,即使最初将 2 发送到构造函数,_value 的值始终返回为零。

Class Example
    Public _value As Integer
    Public Sub New(ByVal _value)

    End Sub
    Public Function Value() As Integer
        _value *= 2
    End Function
End Class

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim x As New Example(2)
    For i = 0 To 9
        MessageBox.Show(x.Value)
    Next
End Sub

【问题讨论】:

  • 你有类级变量_value,它永远不会在构造函数中分配。您在构造函数中还有参数变量_value,应将其更改为value。然后,在构造函数中,添加行_value = value
  • 即使最初将 2 发送给构造函数,_value 的值也始终返回为零。 .... 因为您没有将传递的值设置为构造函数。你应该Me._value = _value。使用不同的参数名称以避免使用Me
  • 我相信递归通常涉及一个调用自身的方法。我在这里看不到任何递归操作。

标签: vb.net function recursion


【解决方案1】:

通常字段为Private。如果你想公开你的类中的数据,你可以使用Public Property

更改Sub New 的参数名称。如果正确限定您的名称将起作用,但它会令人困惑。你必须对传入的值做一些事情!将其分配给您的字段_value

您的函数没有返回值。它只是改变了_value 的值。如果您不返回任何内容,请使用Sub。将您的 Function 的名称更改为有意义的名称。添加Return 语句以将值发送回调用代码。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim x As New Example(2)
    For i = 0 To 9
        MessageBox.Show(x.DoubleValue.ToString)
    Next
End Sub

Class Example
    Private _value As Integer
    Public Sub New(ByVal Input As Integer)
        _value = Input
    End Sub
    Public Function DoubleValue() As Integer
        _value *= 2
        Return _value
    End Function
End Class

【讨论】:

  • 在上面的示例类中,如何使用_count 变量来跟踪调用DoubleValue() 的次数?对于我的需要,_count 不需要返回,但每次调用 DoubleValue 时都需要递增和记忆。我还需要能够随时在 Example 类中重置 _count = 0,例如_count=1000.
  • 你想要在课堂上终生计数吗?类的实例在按钮单击的 End Sub 时超出范围。您可以保留一个表单级别的变量,每次调用该函数时都会增加该变量并在 1000 处重置,并使用 if 语句进行检查。
  • 是的,课堂生活。已经尝试了一个公共变量并在DoubleValue 中增加它,但想知道是否有办法让_count 表现得像全局一样,就像_value 表现得像全局一样,但从未在表单级别声明,或公共全局声明。
  • 您可以在 Example 类中创建类级别变量并在函数中递增。请注意,一旦达到点击次数中的 End Sub,该值就会消失。 Example 类实例在该 Sub 中声明。
  • 你能在这里回答这个新问题吗:stackoverflow.com/questions/70230642/…?结果表明 99% 的递归数是由迭代器函数生成的,但目标是您一次只需要一个数字,就像对 .NET 随机数生成器的 .NextDouble 函数调用一样。
猜你喜欢
  • 2022-11-05
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 2018-10-11
  • 1970-01-01
  • 2012-04-21
  • 2011-03-07
  • 2018-10-07
相关资源
最近更新 更多