Function DZEBJZf(x)
Dim b1, b2, b3, b4, bj1 As Double
b1 = 1.71
b2 = 1.56
bj1 = 1.56
If b2 < bj1 < b1 Then
DZEBJZf(x) = DZEBJZ1f(x) + (bj1 - b1) * (DZEBJZ2f(x) - DZEBJZ1f(x)) / (b2 - b1)
End If
End Function
其中 DZEBJZ1f(x), DZEBJZ2f(x)都已經定義過了,且沒有錯誤。在運行程式的時候在這段陳述句發生 DZEBJZf(x) = DZEBJZ1f(x) + (bj1 - b1) * (DZEBJZ2f(x) - DZEBJZ1f(x)) / (b2 - b1)堆疊空間溢位錯誤,這是為什么該怎么改,求指導!
uj5u.com熱心網友回復:
“給定一個小點的輸入,完整單步跟蹤(同時按Alt+7鍵查看Call Stack里面從上到下列出的對應從里層到外層的函式呼叫歷史)一遍。”是理解遞回函式作業原理的不二法門!遞回函式關注以下幾個因素
·退出條件
·引數有哪些
·回傳值是什么
·區域變數有哪些
·全域變數有哪些
·何時輸出
·會不會導致堆疊溢位
uj5u.com熱心網友回復:
邏輯問題,自己的“思路”肯定是錯的!你這樣的代碼,沒有出現“堆疊溢位”,那才是怪事!

當你這個“函式”被呼叫時:
因為陳述句“If b2 < bj1 < b1 Then”中的“邏輯運算式”始終為 True的,因此就會出現“函式的遞回呼叫”;
因為“遞回結束”的條件,跟傳入的引數無關,無論引數是多少,都是“會觸發遞回呼叫”的,
換句話說:這個函式只要被呼叫,就會造成“無窮遞回”的呼叫,豈有不出現“堆疊溢位”的道理!!!
uj5u.com熱心網友回復:
函式的回傳值用下面的形式DZEBJZf = DZEBJZ1f(x) + (bj1 - b1) * (DZEBJZ2f(x) - DZEBJZ1f(x)) / (b2 - b1)
uj5u.com熱心網友回復:
b1 = 1.71b2 = 1.56
bj1 = 1.56
If b2 < bj1 < b1 Then
這三個數是不變的, 那怎么退出遞回?
uj5u.com熱心網友回復:
為什么會有 a<b<c這種寫法?你要判斷三個數的關系,必須用 a<b and b<c
寫成a<b<c以后,運算流程會變成 (a<b) < c
也就是一個Boolean 值<c
也就是根據a<b的結果,得到 True或者False,再跟 c 比較大小( True/False < c )
vb里,true=-1,false=0
所以最終判斷條件會變成 -1 < c 或者 0 < c
uj5u.com熱心網友回復:
DZEBJZf(x) 是一個函式運算式,它是用來回傳結果的,只能作為值去賦給變數,而不可以為函式運算式賦值。a(x)是陣列元素的時候才能出現在等號左邊
uj5u.com熱心網友回復:
一個函式,必須在所有分支上都能回傳結果if xxx then
'回傳結果
else
'這里也要回傳結果
end if
uj5u.com熱心網友回復:
問題的問法不對,直接問你想要的目標是什么,比如:什么樣的輸入,想得到什么樣的輸出,想用遞回實作怎么做。不要把你寫一半已經進死胡同的代碼拿出來讓別人幫你改
uj5u.com熱心網友回復:
一般而言, 遞回或者回圈呼叫出問題都是不滿足退出條件.uj5u.com熱心網友回復:
“給定一個小點的輸入,完整單步跟蹤(同時查看Call Stack里面從上到下列出的對應從里層到外層的函式呼叫歷史)一遍。”是理解遞回函式作業原理的不二法門!遞回函式關注以下幾個因素
·退出條件
·引數有哪些
·回傳值是什么
·區域變數有哪些
·全域變數有哪些
·何時輸出
·會不會導致堆疊溢位
uj5u.com熱心網友回復:
BS樓上兩個挖墳的…………
uj5u.com熱心網友回復:
同鄙視。uj5u.com熱心網友回復:
先學會基本的語法再說uj5u.com熱心網友回復:
你遞回呼叫判斷的條件不明確,一旦進入遞回,就一直呼叫下去,沒有出口,當然溢位啦。做遞回你首先要明確 出口條件是會成立的( If b2 < bj1 < b1 Then)也就是說它是否有不成立的時候?你這個遞回對三個變數一直沒有操作,也就是三個值一直不變,條件要不永遠成立,要不永遠不成立,所有程式要不執行永遠不停,要不不執行。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/48483.html
標籤:VB基礎類
