2013年2月15日 星期五

[C Programming] 數值自乘遞迴解-延伸

請參見數值自乘遞迴解
延伸問題:
1. 請用手算模擬求2^13,2^15,2^17。
2. 請算一算程式計算2^7, 2^8, 2^9,...., 2^14所花的時間。
    在時間上有沒有什麼異常的情況?能解釋問題點在哪嗎?
3. (續上題)請以求2^11, 2^13, 2^15(手算)的步驟來解答上一題的異常情形。
*4. 將程式改成不用遞迴的寫法;且不要用堆疊來模擬。
5. 每次把遞迴用的n值印出來或許有助於第四題。
    但是這些值與n的二進位表示法有什麼關聯?
6. 請擴充這個程式,使得m與n可以是負整數或0。
    如何處理那些不正常的情況?

個人解答:
1. 13->1+6*2->1+3*2*2->1+(1+1+1)*2*2
    15->1+7*2->1+(1+3*2)*2->1+(1+(1+1+1)*2)*2
    17->1+8*2->1+4*2*2->1+2*2*2*2->1+(1+1)*2*2*2
    拆分的時候,如果是奇數就要多拆出1,剩下拆成等份,
    偶數則直接拆成等份。
    如此,每一個+號在程式裡都是一個乘法,
    每一個乘號也是。計算總符號個數就知道做了多少次乘法運算。
2. 以1.的方法,
        7   -> 1+(1+1+1)*2         4次
        8   -> (1+1)*2*2             3次
        9   -> 1+(1+1)*2*2         4次

      10   -> (1+(1+1)*2)*2      4次
      11   -> 1+(1+(1+1)*2)*2  5次
      12   -> (1+1+1)*2*2         4次
      13   -> 1+(1+1+1)*2*2     5次
      14   -> (1+(1+1+1)*2)*2  5次
    11、13、14會是花最多時間的,最少的則為8,
    它會比算7來的快。異常情形在於時間上不是單純數字較大就較慢。
    解釋的話,請見3.。
3. 15   -> 1+(1+(1+1+1)*2)*2  6次   
簡單來說當每次拆分無法整除時,只能多花一次乘法去乘以m。
因此這種狀況越多,使用的乘法就會越多。
4. 在下一題的時候會提到。
5. 分解時,相當於在將n轉為二進位,
    只是這個方法並沒有留存n的記錄。
6. 0^0->無意義
    m^0, m!=0 -> 1
    0^n, n!=0 -> 0
    m為負整數的做法和正整數的做法沒有區別,
    剩下n為負整數的部分可先求m^(-n),
    求完以後再行倒數,注意使用可支援小數點的資料型態如double。

沒有留言:

張貼留言