LeetCode 劍指offer 16 數值的整數次方

package jianzhioffer;
/**
 * 複寫pow函數,且x在正負100之內,指數也爲整數,首先直觀的想到第一種方法暴力循環相乘即可,只要注意指數負數的時候變爲除法
 * 
 * 第二種也是能夠想到的遞歸,這種由類似相同子問題構成的大問題,都可以由遞歸解決
 * 假設求pow(x,n) :1 當n爲偶數時,遞歸關係爲pow(x,n)=pow(x,n/2)*pow(x,n/2)
 *                 2 當n爲奇數時,遞歸關係爲pow(x,n)=pow(x,n/2)*pow(x,n/2)*x
 *  注意每次遞歸調用pow(x,n/2)*pow(x,n/2)函數,因爲子問題相同,只需要調用一次pow即可
 *  然後遞歸出口要注意: 1 當n==0時 直接返回1
 *                    2 當n<0時 返回1/x
 *                    3 當n>0時 返回x
 * 
 * */
public class Q16 {
    public double myPow(double x, int n) {
        double re = 1;
        if (n > 0) {
            int i = 0;
            while (i < n) {
                re *= x;
                i++;
            }
        } else if (n == 0) return 1;
        else {
            int i = 0;
            while (i > n) {
                re /= x;
                i--;
            }
        }
        return re;
    }


    double myPow2(double x, int n) {
        if (n == 0) return 1;
        if (n == 1)
            return x;
        if (n == -1)
            return 1 / x;
        double d = 1;
        if (n % 2 != 0) {
            if (n > 0)
                d = x;
            else d = 1 / x;
        }
        double r = myPow2(x, n / 2);
        return r * r * d;
    }



    public static void main(String argc[]) {
        System.out.println(new Q16().myPow2(34.00515, -3));
        System.out.println(Math.pow(34.00515, -3));
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章