阿摩線上測驗 登入

申論題資訊

試卷:109年 - 109 普通考試_資訊處理:程式設計概要#88788
科目:程式設計
年份:109年
排序:0

申論題內容

四、請問下列程式執行後,印出結果為何?(作答必須解釋計算過程,只寫答 案而未加解釋,只能得部分分數。)5f193a1453f40.jpg

詳解 (共 3 筆)

詳解 提供者:Mihaeru

3樓解釋流程很完整,所以我只用自己的理解說說看

從sqst()中可以看到有include跟exclude兩個遞迴:    
include會將(n-1)、當前sum與當前arr[n]相減往下帶
exclude則會將(n-1)、當前sum繼續往下
也就是從arr最後一個內容開始判斷要不要與sum相減,有要(include)與不要(exclude)兩個選擇,然後往前一個數字繼續判斷

而返回true的條件為sum等於0,也就是說某個往下遞迴的選擇路線中會讓sum要剛好等於0,所以如果要返回true,arr中會有數字相加剛好等於sum
並且sqrt最後return (include || exclude),只要有一種相減的組合符合sum為0就會回傳true
從arr中可以看到7+2+5 = 14 =sum,所以我們知道最後sqrt()會返回true,cout出"Yes"
所以會執行出true的路線為:
n=4,exclude:遇到arr[4]為8
n=3,include:遇到arr[3]為5
n=2,include:遇到arr[2]為2
n=1,exclude:遇到arr[1]為3
n=0,include:遇到arr[0]為7

也就是說知道程式碼在做什麼後再用結果論推回去來解釋

詳解 提供者:fun40431

int main(){ int arr[]= {7,3,2,5,8}; int sum = 14; int n = sizeof(arr)/sizeof(arr[0]); if(sqst(arr,n-1,sum))cout<<"yes"; else cout<<"no"; return 0;} 每個int 它的大小是4byte所以sizeof(arr[0]) = 4 (單一個int)sizeof(arr)= 20 (共五個int)n=20/4 = 5接下來是如果執行sqst(arr,n-1,sum) 這函數回傳是true 則顯示Yes,否則顯示No接下來看bool sqst()的函式n = 4, sum = 14都不會回傳true或false則先將值傳到bool include看sum是否為0回傳true或是 n<0||sum<0 回傳false如果傳回false則傳值到exclude讓他n-1後繼續執行最後結果是執行exclude >include >include > exclude 的狀況下sum會為0 這題答案應該是Yes   

詳解 提供者:hchungw

這段 C++ 程式碼中的函數 sqst 是一個遞迴函數,目的是判斷給定數組 arr[] 中是否存在一組數字,其總和等於 sum。函數使用了「包括-不包括」的方法來尋找所有可能的數字組合。我們將逐步通過這個遞迴過程來找出最後的結果。
讓我們手動運行遞迴函數 sqst 的邏輯來找出答案:
函數首先檢查 sum 是否為 0,如果是,則返回 true。
然後檢查索引 n 是否小於 0 或者 sum 是否小於 0,如果是,則返回 false。
接下來,進行兩次遞迴呼叫:一次是「包括」當前索引 n 的數值(arr[n] 從 sum 中減去),另一次是「不包括」當前索引 n 的數值(sum 保持不變)。
最後,如果「包括」或「不包括」任一遞迴呼叫返回 true,則函數返回 true,否則返回 false。
在 main 函數中:
數組 arr[] 被初始化為 {7, 3, 2, 5, 8}。
sum 被設置為 14。
n 被計算為數組的長度,即 5。
函數 sqst 被呼叫來檢查是否存在數組中數字的組合其總和為 14。
根據數組 {7, 3, 2, 5, 8} 和 sum = 14,我們可以看到數組中的 7 + 5 + 2 = 14 或者 3 + 5 + 2 + 8 - 4 = 14,所以函數 sqst 應該返回 true。
因此,根據這個遞迴邏輯,主函數應該輸出 "Yes"。