作者x000032001 (16襙你妈^_^)
看板Visual_Basic
标题Re: [VB6 ] 关於副程式执行递回
时间Sat Jun 5 22:55:48 2010
※ 引述《stator (别急着吃棉花糖)》之铭言:
: 因为在练习写一个递回程式,当按了按钮,想要跑出阶乘的效果
: 但执行时,输入完数字後却失败,错误是指向副程式的 k*result(k-1)
: 说是必须为函数或变数,有试过用函数FUNCTION是正常的
: 但用副程式来写就错了。
: 请问这是哪里错了呢?谢谢各位前辈
: Private Sub Command1_Click()
: Dim k As Integer
: n = InputBox("请输入一数")
: Call result(n)
: Print n
: End Sub
: Sub result(ByRef k) '阶乘
: If (k = 1) Then
: k = 1
: Else
: k = k * result(k - 1)
: End If
: End Sub
耍白痴了 把刚刚写的砍掉
--
本来用func来递回的话
输入k=5
func = k*func(k-1)
= 5*func(4) (程式纪录这边的k=5然後再次呼叫func)
= ...
= 5*4*3*2*1 (k=5~2都是递回产生 1是我们设的中断条件)
如果用sub的话 还记得ByRef都是存取同一个记忆体位置吧
所以就 输入k=5
k = k*sub(k-1)
= 5*sub(4)
= 5*4*sub(3)
= ...
当到了中断条件k=1的时候 副程式返回会怎样呢
由於存取同一个位置 我们又把k=1
所以就变成k = 1*1*1*1*1
返回1
但是用ByVal的话呢? 那变数周期会在副程式结束时消失
除非设定全域变数 不然怎麽拿到我们要的结果
但是何苦这麽麻烦呢XD 用fun传回就好了
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.240.28.247
※ 编辑: x000032001 来自: 123.240.28.247 (06/05 23:02)
※ 编辑: x000032001 来自: 123.240.28.247 (06/05 23:06)
1F:推 stator:谢谢X大,解了我心中的疑惑 06/06 00:33