阿摩線上測驗 登入

申論題資訊

試卷:103年 - 103年關務人員、103年身心障礙人員及103年國軍上校以上軍官轉任考身障特考四等_資訊處理#31152
科目:程式設計
年份:103年
排序:0

申論題內容

二、有一個 C 語言的函式,函式名稱為 secret,其內容如下: void secret(int n) { if(n>0) { secret(n/3); printf("%d:%d...%d ",n,n/3,n%3); } return ; } ⑴請描述 secret 函式功能為何?(10 分) ⑵請問 secret(30)的輸出結果為何?(10 分)

詳解 (共 2 筆)

詳解 提供者:hchungw

secret 函式是一個透過遞迴呼叫自身來處理和輸出整數 n 相關信息的函式。具體來說,它按以下步驟運作:

  1. 檢查傳入的整數 n 是否大於 0。如果不是,函式不執行任何操作並返回;如果是,則繼續下一步。
  2. 對 n 執行遞迴調用 secret(n/3)。這意味著函式將持續遞迴調用自己,每次都將當前 n 的值除以 3,直到 n 的值不再大於 0。
  3. 在從每次遞迴調用返回後,函式會輸出當前 n 的值、n 除以 3 的結果、以及 n 除以 3 的餘數。
  4. 最後,函式返回,不返回任何值(因為它的返回類型為 void)。

總之,secret 函式的主要功能是對於給定的正整數 n,透過遞減的遞迴過程(每次遞迴 n 值除以 3),打印出每個階段的 n 值、n/3 的結果以及 n%3 的餘數。這種方式顯示了一種分解整數的過程,直到無法進一步分解(即 n 小於或等於 0)為止。此函式的輸出提供了一種觀察整數在逐步除以 3 時的行為模式的方式。

 

要找出 secret(30) 的輸出結果,我們可以手動追蹤 secret 函式的遞迴呼叫及其輸出。讓我們一步步來看:
初始呼叫是 secret(30)。
因為 30 > 0,函式進行遞迴呼叫 secret(10)(因為 30/3 = 10)。
在 secret(10) 中:
同樣,10 > 0,所以它呼叫 secret(3)(10/3 = 3,取整數部分)。
在 secret(3) 中:
3 > 0,所以它呼叫 secret(1)(3/3 = 1)。
在 secret(1) 中:
1 > 0,所以它呼叫 secret(0)(1/3 = 0,取整數部分)。
在 secret(0) 中:
0 不大於 0,所以這次呼叫不執行任何操作並直接返回,開始逆序回溯並輸出。
隨後的輸出會在每次遞迴返回後發生,輸出格式為 n:n/3...n%3 :
從 secret(1) 返回時,輸出 1:0...1 。
從 secret(3) 返回時,輸出 3:1...0 。
從 secret(10) 返回時,輸出 10:3...1 。
從 secret(30) 返回時,輸出 30:10...0 。
所以,secret(30) 的輸出結果將是 1:0...1 3:1...0 10:3...1 30:10...0 。

 

詳解 提供者:Triple w.

8AAAAASUVORK5CYII=

 

(1) 描述 secret 函式功能

secret 函式的功能是遞迴地將一個整數 n 除以 3,並在每一步打印出 n、n/3 和 n%3 的值。具體來說:
  • if(n>0) 是一個遞迴終止條件,當 n 小於或等於 0 時,函式會停止遞迴。
  • 在遞迴的每一步中,secret(n/3) 會先被呼叫,然後打印出當前的 n、n/3 和 n%3。這樣,函式會按從最深的遞迴層開始,向外層逐步回溯,打印出每層的數值。

(2) secret(30) 的輸出結果

我們來逐步解析 secret(30) 的輸出結果:
  • secret(30) 呼叫 secret(10)。
  • secret(10) 呼叫 secret(3)。
  • secret(3) 呼叫 secret(1)。
  • secret(1) 呼叫 secret(0),這時 n 等於 0,所以函式返回,不進行任何打印。
  • 當 secret(1) 返回後,會打印 1:0...1。
  • 當 secret(3) 返回後,會打印 3:1...0。
  • 當 secret(10) 返回後,會打印 10:3...1。
  • 最後 secret(30) 返回後,會打印 30:10...0。
所以,secret(30) 的輸出結果為:1:0...1 3:1...0 10:3...1 30:10...0。