返回列表 上一主題 發帖

[發問] 請問堆積排序 遞迴 完全二元樹的範例如何修正

[發問] 請問堆積排序 遞迴 完全二元樹的範例如何修正

本帖最後由 singo1232001 於 2021-7-27 01:21 編輯

小弟目前在學演算法
因為非本科,許多概念要重新學習
先參考了 其他語言的寫法改寫成VBA
正好練習建構概念

但當中遇到一個問題 計算"葉子節點位"時會超過陣列大小
問題在 堆積排序遞迴.Function heapify 裡面的註解位置
只要把這四行
    If c1 > n Or c2 > n Then
    heapify = tree        
    Exit Function           
    End If               
取消掉 就會出錯

原始的範例程式上 並沒有需要另外建置這段,此相關的問題監看後(原始範例設6  第三次 遞迴時,C1算到7)

由於也是剛開始試著寫 Function 沒多久 ,有很多不會寫的地方

若有語法不對 概念錯誤 原則錯誤的部分 煩請高手們指點一下

這份檔案如何修改比較符合原始範本的想法呢? (檔案內有youtube的影片連結可以參考)

堆積排序 堆排序 堆樹 完全二元樹.zip (405.39 KB)

回復 1# singo1232001
自己回復自己問題
找到問題所在
原因在於 此題AB兩者之間有相關性,他會先用A判斷B是否異常,而無法一起同時 if A and B 一起判斷  
步驟改為 if A =true then :if B=true then xxxx
避免B本身異常
   
另外附上檔案參考

堆積排序 堆排序 堆樹 完全二元樹.zip (802.22 KB)

TOP

回復 2# singo1232001

感謝分享

'一個從10變成1的遞迴(台) 遞歸(陸),我修改如下

Sub 基礎遞迴測試()
    Debug.Print Time
    Debug.Print factorial(10) & "END"
End Sub

Function factorial(n)
    Debug.Print n
    If n > 1 Then factorial = factorial(n - 1)
End Function
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

本帖最後由 n7822123 於 2021-7-28 04:51 編輯

回復 2# singo1232001

原因在於 此題AB兩者之間有相關性,他會先用A判斷B是否異常,而無法一起同時 if A and B 一起判斷  
步驟改為 if A =true then :if B=true then xxxx
避免B本身異常

VB6是比較舊的語法摟~ IF A and B then .....   

程式會 A 跟 B都 判斷,再用And邏輯計算,不管 A 是 True 還是 False

VB.Net 幾乎都用 AndAlso 了(要用And也是可以),亦即前面先判斷,前面若為 False 則不往後判斷

等同你拆兩行寫~  你可以用以下程式分出區別,在VBA會跳出錯誤,在VB.Net 用AndAlso不會跳錯誤


123.png
2021-7-28 04:47
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

本帖最後由 n7822123 於 2021-7-28 05:01 編輯

回復 2# singo1232001

看你用 遞歸 寫 階層函數

那我來考考你~ 如何只使用1個 For 迴圈,且不能用乘法運算子 "*"

靠加法運算子,寫出 一個計算階層的函數

Ex:
輸入參數 1,5  會反饋 120 (1*2*3*4*5)  
輸入 參數2,6  會反饋 720 (2*3*4*5*6)  
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

本帖最後由 singo1232001 於 2021-7-28 10:05 編輯
  1. Function addZ(m, n)
  2. If m = 0 Then Exit Function
  3. If i <= n Then addZ = addZ(m + (-1), n) + n
  4. End Function

  5. Function Mu(m, n)
  6. If n = m Then
  7.     Mu = m
  8. Else
  9.    Mu = addZ(m, Mu(m + 1, n))
  10. End If
  11. End Function
  12. Sub main()
  13. Debug.Print Mu(2, 6)
  14. End Sub
複製代碼
回復 5# n7822123


這道題目真好 有夠刺激

直接突破我的盲腸

我目前是亂寫的 概念上還是有問題

解題 讓我更加熟悉遞迴的玩法

還獲得了許多的思路 感謝感謝

目前我的答案有兩個缺點 1.找不到地方插入迴圈 2.用上了一個負號

研究了三個小時多 堅持不下去了

求大神解答

TOP

回復 6# singo1232001

你的答案也不錯,用了兩個遞歸~

Function Factorial(A, B) As Long
Dim S&
If A > B Then Factorial = 1: Exit Function
For i = 1 To A
  S = S + Factorial(A + 1, B)
Next i
Factorial = IIf(S = 0, 1, S)
End Function

Sub Test()
MsgBox Factorial(2, 6)
End Sub
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

回復 7# n7822123


    感謝指導

TOP

        靜思自在 : 要批評別人時,先想想自己是否完美無缺。
返回列表 上一主題