四、請問下列程式執行後,印出結果為何?(作答必須解釋計算過程,只寫答 案而未加解釋,只能得部分分數。)
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
也就是說知道程式碼在做什麼後再用結果論推回去來解釋
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