輸入N
輸入第一層的~第N層的啟始跟終值
計算每一組迴圈數相加之結果
EX:
輸入3
輸入啟始1 終值2
輸入啟始2 終值3
輸入啟始5 終值3
輸出
8 7 6 9 8 7
9 8 7 10 9 8
相當於
For i = 1 To 2
For j = 2 To 3
For g = 5 To 3 Step -1
Print i j g;
Next g
Next j
Print
Next i
月島大大像這一題的可深度迴圈因該怎麼寫
(你用文字說明差不多了解了)可是還是有點??
2005-11-04 06:18:42 · 4 個解答 · 發問者 Anonymous in 電腦與網際網路 ➔ 程式設計
月島大大:
無限深度迴圈:
先把你的迴圈深度設為可變動陣列a
產生另一個可變動二維陣列b用來紀錄每一層的啟始 終值 和STEP值
先把陣列a初始化(把啟始值讀進陣列a)
DO
陣列a的數字開始累加陣列b對應的step值
如果數字超出陣列b對應終值就把下一個陣列a的值+陣列b對應的step值
如果代表最表層的陣列a已經超出陣列b對應終值就Exit Do
陣列a的各元素即為你的現在迴圈值(a(0)a(1)a(2)a(3)a(4))
LOOP
遞迴:
不知道該怎麼解釋
總之是自己呼叫自己 XD
2005-11-04 06:22:01 · update #1
阿不是才剛講完?上次講的哪裡不懂,直接把問題提出來,不用在問一次同樣的問題吧?
2005-11-04 11:26:54 補充:
無限迴圈當然是要自己呼叫自己啦
月島是用DO和一直重複REDIM陣列來做這東西
各有各的好處,其解釋與思考方式已經在上篇討論過了
我的作法是利用FOR迴圈來做個無限FOR迴圈
月島題目中的迴圈,其重點是在於怎麼把每個迴圈的值相加
不然基本迴圈很容易寫
function my_loop (x,y,z)
for i = x to y step z
my_loop x ,y ,z
next
end function
你要最短的話,上面這就是最短的,最基本的無限迴圈只不過跳不出來而已...
無限的FOR迴圈是要你明白基本上FOR迴圈是在幹嘛的
程式比較長是因為月島要把FOR的值給相加的關係
不然基本上這樣就行了
Private Function my_loop(ByVal xIndex As Integer) As Integer
Dim i, x, y, z As Integer
Dim w
If xIndex < max_loop Then
w = Split(xCollection(xIndex), ",")
x = CInt(w(0)): y = CInt(w(1)): z = CInt(w(2))
For i = x To y Step z
Select Case xIndex
Case max_loop - 1
看結果要幹嘛而定...
Case 0
my_loop xIndex + 1←指向下一層的FOR LOOP並帶入下一層的INDEX值
Case Else
my_loop xIndex + 1
End Select
Next i
End If
End Function
你要思考你輸入的數字基本上是採『字串』形式
輸入3
輸入啟始1 終值2
輸入啟始2 終值3
輸入啟始5 終值3
基本上,電腦看到的是 "3 1 2 2 3 5 3"
那你該想怎麼樣讓電腦判別是這樣的格式 "3 (1 2) (2 3) (5 3)"
第一個三,指的是三層,後面的( )內指的是啟始、終結值
不過,個人有個人的作法,我直接把它變為 "1,2:2,3:5,3" 類似這樣輸入,然後再拆解字串成為陣列 "1,2" "2,3" "3,5"
然後再來拆解為 字串陣列(0) = 1 , 2
之後帶入到 for x = 1 to 2 ← 就是這樣來的
所以我這裡面有所謂的拆字串動作,就是這樣來的
w = Split(xCollection(xIndex), ",")
x = CInt(w(0)): y = CInt(w(1)): z = CInt(w(2))
xCollection 基本上已經被我拆成字串陣列
所以 xindex 就直接指向某個陣列內,然後把裡面的三個數字(一個字串)取出
取出後經過SPLIT,就變成W陣列,W陣列就會有三個字串值,也就是啟始、終結與STEP值
然後套回到FOR LOOP中
For i = x To y Step z
接下來,如果你不做什麼事的話,這程式就會在這一直打轉直到天荒地老
所以,你必須要判別什麼時候該停止
什麼時候算是第一次進入
其他情況時候,該做些什麼事
2005-11-04 06:26:54 · answer #1 · answered by Anonymous · 0⤊ 0⤋
哈哈沒想到剛寫好就有人已經po上來了!!
Dim S() As String, Y() As Integer
Private Sub Command1_Click()
Dim I As Integer, X As Integer, R As Integer
Dim S1 As String, S2 As String
ReDim S(0)
Do
S1 = InputBox("請輸入啟使值(第" & R + 1 & "層)")
If S1 = "" Then Exit Do
If IsNumeric(S1) = False Then Exit Sub
S1 = CStr(CInt(S1))
S2 = InputBox("請輸入終值(第" & R + 1 & "層)")
If S2 = "" Then Exit Do
If IsNumeric(S2) = False Then Exit Sub
S2 = CStr(CInt(S2))
ReDim Preserve S(R)
ReDim Preserve Y(R)
If CInt(S1) <= CInt(S2) Then
X = 1
Else
X = -1
End If
For I = CInt(S1) To CInt(S2) Step X
S(R) = S(R) & CStr(I)
Next
Y(R) = 1
R = R + 1
Loop
If S(0) <> "" Then RaCal
End Sub
Function RaCal()
Dim I As Integer, R As Integer, T As Integer
For I = 0 To UBound(S)
T = T + Val(Mid(S(I), Y(I), 1))
Next
Print T;
For R = UBound(S) To 0 Step -1
If R = 0 Then Print
If Y(R) < Len(S(R)) Then
Y(R) = Y(R) + 1
Exit For
End If
Next
If R < 0 Then Exit Function
For I = R + 1 To UBound(S)
Y(I) = 1
Next
RaCal
End Function
2005-11-04 12:38:13 · answer #2 · answered by W.J.S. 7 · 0⤊ 0⤋
補一下
kukka大寫的是方法
我就來寫心得吧 XD
遞迴不是一蹴可及(這個成語好像有點怪)的
需要一定的功力才能了解和吸收
不是我在潑冷水
因為真的很傷腦細胞
沒有一定的實力和對邏輯概念不熟
光看就看不懂了
更別說要寫出來
所以看得懂表示你進步了(可喜可賀)
如果可以自己寫出來 那表示你又更強了(放鞭炮慶祝)
前言結束 以下為本文
模擬的無限深度迴圈等於是遞迴的無呼叫版
但對於複雜度比較高的程式並不適用
因為程式的撰寫難度會大得多
所以我現在大部份都改用遞迴來撰寫
只是對於遞迴還不熟的人來說
這一個模擬的程式段可以讓他比較好去理解
程式的流程
以我的經驗來說
要學遞迴要先對你要撰寫的程式做一個歸納
找出其規律性
再早一些的時後
我遇到要寫遞迴的時候
會先把他想成是一個很深層的迴圈
再把它轉化為一個一個的規律
接著按規律把它撰寫出來
遞迴要撰寫之前
一定要對於該程式的流程要很清楚
或者說你可以建一個最小模型
想一下 你要處理的字串 不是題目要的七個八個
而是只有三個 甚至是兩個時
你的程式是怎麼跑
等到清楚了
在把它擴展到目前的程式上
用思考的方式測試一下是否正確
再開始著手撰寫遞迴
我認為遞迴是一個手段
一個讓超長又沒有彈性的程式碼變得更具有汎用性的手段
結論
遞迴真不是人學的XD(開玩笑的)
お楽しみに~♪
補上一個遞迴小程式當最簡單的入門說明
由輸入的啟始值開始列印到終值(很無聊我知道 ,但他還是個遞迴)
'假設我啟始值一定小於終值
Private Sub Form_Activate()
Dim START As Integer
Dim LAST As Integer
START = Val(InputBox("N="))
LAST = Val(InputBox("N="))
Call AA(START, LAST)
End Sub
Private Sub AA(First As Integer, Final As Integer)
If First < Final Then
Print First
Call AA(First + 1, Final)
Else
Print Final
End If
End Sub
2005-11-04 08:59:22 · answer #3 · answered by ? 5 · 0⤊ 0⤋
kukka大大這個程式沒辦法在縮短嗎
跟月島大大說的感覺差漫多的
2005-11-04 11:45:18 補充:
輸入3
輸入啟始1 終值2
輸入啟始2 終值3
輸入啟始5 終值3
這些值要怎把他放進去副程式裡
2005-11-04 06:30:54 · answer #4 · answered by Anonymous · 0⤊ 0⤋