Java 递归解决 "仅仅能两数相乘的计算器计算x^y" 问题

/**
 * 求一个数的乘方
 * 求x^y,y是一个正整数。

设计算器仅仅能计算两数相乘,不能一次计算n个数相乘。

* 知:2^5=(2^2)^2*2;   2^6=(2^2)^3=((4)^2)*4;  2^8=(2^2)^4= (4^2)^2= 16^2
 * 得到规律:x^y= (x^2)^(y/2),定义a=x^2,b=y/2, 则得到形如: x^y= a^b;
 *     y假设是奇数,则分解的最后还要再乘以a(如上面2^6分解成4^3时):x^y=a^b*x.
 *
 * 用递归来解:那么每次x都传入一个新的值。即是a。y值倍减,即是b
 *
 * @author stone
 * @date   2015-7-2 上午11:31:53
 */
public class Power {

	private static long pow(long x, long y) {
		if (x == 0 || x == 1) {
			return x;
		}
		long tx = 0;
		long ty = 0;
		if (y > 1) {
			ty = y / 2;
			tx = x * x;
			System.out.println(tx);

			if (y % 2 == 0) {
				return pow(tx, ty);
			} else {
				return pow(tx, ty) * x;
			}
		} else {
			return x;
		}
	}

	public static void main(String[] args) {
		long result = pow(2, 10);
		System.out.println(result);
	}
}
时间: 2024-10-27 00:22:32

Java 递归解决 "仅仅能两数相乘的计算器计算x^y" 问题的相关文章

Java 递归解决 "只能两数相乘的计算器计算x^y" 问题

/** * 求一个数的乘方 * 求x^y,y是一个正整数.设计算器只能计算两数相乘,不能一次计算n个数相乘. * 知:2^5=(2^2)^2*2; 2^6=(2^2)^3=((4)^2)*4; 2^8=(2^2)^4= (4^2)^2= 16^2 * 得到规律:x^y= (x^2)^(y/2),定义a=x^2,b=y/2, 则得到形如: x^y= a^b; * y如果是奇数,则分解的最后还要再乘以a(如上面2^6分解成4^3时):x^y=a^b*a. * * 用递归来解:那么每次x都传入一个新的

JAVA实现求一点到另两点连线的距离,计算两点之间的距离

直接上代码 /** *计算两点之间距离 */ public static double getDistance(Point start,Point end){ double lat1=start.getX().doubleValue(); double lat2=end.getX().doubleValue(); double lon1=start.getY().doubleValue(); double lon2=end.getY().doubleValue(); return Math.sq

LeetCode01 - 两数之和(Java 实现)

LeetCode01 - 两数之和(Java 实现) 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/two-sum 题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + n

C语言用递归求斐波那契数,让你发现递归的缺陷和效率瓶颈

递归是一种强有力的技巧,但和其他技巧一样,它也可能被误用. 一般需要递归解决的问题有两个特点: 存在限制条件,当符合这个条件时递归便不再继续: 每次递归调用之后越来越接近这个限制条件. 递归使用最常见的一个例子就是求阶乘,具体描述和代码请看这里:C语言递归和迭代法求阶乘 但是,递归函数调用将涉及一些运行时开销--参数必须压到堆栈中,为局部变量分配内存空间(所有递归均如此,并非特指求阶乘这个例子),寄存器的值必须保存等.当递归函数的每次调用返回时,上述这些操作必须还原,恢复成原来的样子.所以, 基

leetCode:twoSum 两数之和 【JAVA实现】

LeetCode 两数之和 给定一个整数数组,返回两个数字的索引,使它们相加到特定目标. 您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素. 更多文章查看个人博客 个人博客地址:twoSum 两数之和 [JAVA实现] 方法一 使用双重循环两两相加判断是否等于目标值 public List<String> twoSum2(int[] arr, int sum) { if (arr == null || arr.length == 0) { return new ArrayL

算法练习:两数之和

题目:给定一个整型数组,是否能找出两个数使其和为指定的某个值?注:整型数组中不存在相同的数. 一.解题方法 1.暴力破解法(时间复杂度O(n^2) ) 这是最容易想到的一种方法,即使用两层循环,从数组里取出一个数,然后在此数之后部分找出另外一个数,计算两数之和,判断是否等于指定值.如下: //直观的办法,使用两个循环 bool IsExistSumOfTwoNum( int nArray[], int nCount, int nSum ) { bool bRet = false; for ( i

2_两数相加

目录 2_两数相加 描述 方法一:小学数学 思路 Java 代码(非递归写法) Java 代码(递归写法) Python 代码(非递归写法) 2_两数相加 描述 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 8

java:递归的结构--基础篇

递归结构: 递归的基本思想就是"自己调用自己" [示例1-1] public static void main(String[] args) { a(); } static void a(){ System.out.println("a"); a(); } 如上示例,将会报错java.lang.StackOverflowError的错吴,错误的原因:是由于a方法一直调用a方法,而没有释放,导致内存不足,才产生的错误. 递归结构分为两部分: 1.定义递归头:解答:什么

两数之和,三数之和,最接近的三数之和,四数之和

LeetCode有一系列做法套路相同的题目,N数之和就可以算一个 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 第一个解决办法,简单暴力,堆for循环就是,但