注册 登录
编程论坛 VB6论坛

新手请教:这段程序中x怎么会等于10,是从s=s(n-1)+n这公式计算出的?怎么算出的没搞懂?

zh99ja 发布于 2020-05-10 08:28, 2985 次点击
Function s(n As Integer) As Integer
If n = 1 Then
s = 1
Else
s = s(n - 1) + n
 End If
End Function

Private Sub form_click()
Dim x As Integer
x = s(4)
Print x
End Sub

正确答案是:x=10

而对于我这个生手,真有点不太清楚这程序的计算过程?求高手指教,谢谢了!
10 回复
#2
zh99ja2020-05-10 09:30
仿佛这段程序中的if then endif是个循环程序,循环从n=4至n=1终止,但if只是个条件语句不是循环语句,是谁在让它循环?
#3
zh99ja2020-05-10 09:45
如果循环真的进行了
n从4至1,我试着列出相应的s=s(n-1)+n的公式如下:
当n=4时,s=s(3)+4
当n=3时,s=s(2)+3
当n=2时,s=s(1)+2
当n=1时,s=s(0)+1,当然此时已经在条件中直接是n=1 then s=1 了。
但上面的左边的s值是多少是怎么算出来的?
在程序中插入打印,上面的n=4,3,2,1时相应的x=s(n)从上而下是10,6,3,1,其中10就是正确答案。
但确实不知道怎样得出的???
#4
zh99ja2020-05-10 10:03
这个试题是我无意查VB程序时碰到的,具体那个网站忘记了,有四个选择,最后一个就是10,自己琢磨了半天没猜出来,只好写下程序在vb6上运行,单击窗体就出现10,所以我估计10应该就是正确答案。
#5
风吹过b2020-05-10 10:59
s  函数是一个递归,自己调用自己,那就是一循环了。
s(4)
先调用 s=s(3)+4
这时,s(3)又继续调用 s=s(2)+3
然后,发现s(2)又得再次调用 s=S(1)+2
然后,继续发现 s(1)又得调用 s=1
然后依次返回给上面一层的调用结果
最终
每步得到的结果是:
1
3
6
10
输出最终结果:10

实际上,就是依次扩展算式
x=1+2+3+4


#6
HVB62020-05-10 11:35
此程序是“递归”,即“1+2+3+4=10”,改一处“s = s(n - 1) + n”为“s = s(n - 1) *n”,则为n!
Function s(n As Integer) As Integer
If n = 1 Then
s = 1
Else
's = s(n - 1) + n
s = s(n - 1) *n
 End If
End Function

Private Sub form_click()
Dim x As Integer
x = s(4)
Print x
End Sub
#7
zh99ja2020-05-10 11:39
谢谢,有点启发了,由于自己是生手,但要完全懂你说的这依次扩展算式,包括其中的“函数是一个递归,自己调用自己”的内容可能还得多学习实践下,有点惭愧,见笑了,容我再慢慢体会你说明的内容,再次谢了!
#8
zh99ja2020-05-10 14:19
刚才回到原输入的程序中,按你上面提到的将s = s(n - 1) + n改为s = s(n - 1) *n,应该就是N!阶乘的递归吧,试运行一下,也能输出x=s(4)结果,不过不是10而变成24了,一边学一边试,能有点长进。
#9
zh99ja2020-05-10 14:48
也学到一点,这个递归的控制终止在于if n=多少的设置,将原程序中n=1改为n=-10,那递归将在n从4减一一直到n=-10,在s = s(n - 1) + n中还能进行下去,但在改为s = s(n - 1) *n的阶乘递归后,到n=-10时,程序提示 :溢出了,至于相应条件语句中if n=多少时的s对应值也要根据需要变动,否则这个程序中的结果x=s(4)的原来的10会变的说不清楚了。。。
#10
zh99ja2020-05-12 11:15
有一个问题?如果程序中是写的s(n)=s(n-1)+n,那好像这递归调用自己看起来就比较明显,要是按程序中的s=s(n-1)+n就好像这个s与s()不是一类数?
这s(n)=s(n-1)+n和s=s(n-1)+n在递归上有区别吗?还是vb中规定就是一样的?
#11
HVB62020-05-12 13:10
回复 9楼 zh99ja
程序改为以下,就不会“溢出”:
Function s(n As Integer) ' As Integer不要
If n = 1 Then
s = 1
Else
s = s(n - 1) * n
 End If
End Function

Private Sub form_click()
'Dim x As Integer不要
x = s(10)
Print x
End Sub
1