Java递归例子——求x的y幂次方

假设n的值大于0。

一:源程序:

ContractedBlock.gifExpandedBlockStart.gifView Code
package one;

public class RecursionTest {

/**
*
@param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
RecursionTest rt = new RecursionTest();
int x = 6;
int y = 2;
long result = rt.getPower(x, y);
System.out.println(
"The result of "+x+"'s "+y+" times power = "+result);
}

private long getPower(int x, int y){
if(y == 0) return 1;
   
if(y == 1) return x;
return x*getPower(x, y-1);//36
// return x*getPower(x, --y);//36
// return x*getPower(x, y--);//Exception in thread "main" java.lang.StackOverflowError:当应用程序递归太深而发生堆栈溢出时,抛出该错误。
}
}

求幂次方的递归实现方法1:

private long getPower(int x, int y){
        if(y == 0) return 1;
        if(y == 1) return x;
        return x*getPower(x, y-1);
    }

方法2:

private long getPower(int x, int y){
        if(y == 0) return 1;
        if(y == 1) return x;
        return x*getPower(x, --y);
    }

这两种方法应该是一样的,只不过写法不同。

至于下面的方法3:

private long getPower(int x, int y){
        if(y == 0) return 1;
        if(y == 1) return x;
        return x*getPower(x, y--);
    }

这种方法会抛出异常:Exception in thread "main" java.lang.StackOverflowError:当应用程序递归太深而发生堆栈溢出时,抛出该错误。

至于到底递归有多深呢?可以用下面的程序查看一下:

ContractedBlock.gifExpandedBlockStart.gifView Code
package one;

public class RecursionTest {

/**
*
@param args
*/
static long num = 0;
public static void main(String[] args) {
// TODO Auto-generated method stub
RecursionTest rt = new RecursionTest();
int x = 6;
int y = 2;
long result = rt.getPower(x, y);
System.out.println(
"The result of "+x+"'s "+y+" times power = "+result);
}

private long getPower(int x, int y){
num
++;
System.out.println(
"执行方法getPower的次数:"+num);
if(y == 0) return 1;
if(y == 1) return x;
return x*getPower(x, y--);
}
}

运行结果:

.......

执行方法getPower的次数:3393
执行方法getPower的次数:3394
执行方法getPower的次数:3395
执行方法getPower的次数:3396
执行方法getPower的次数:3397
执行方法getPower的次数:3398Exception in thread "main" java.lang.StackOverflowError
    at sun.nio.cs.ext.DoubleByteEncoder.encodeArrayLoop(Unknown Source)
    at sun.nio.cs.ext.DoubleByteEncoder.encodeLoop(Unknown Source)
    at java.nio.charset.CharsetEncoder.encode(Unknown Source)
    at sun.nio.cs.StreamEncoder.implWrite(Unknown Source)
    at sun.nio.cs.StreamEncoder.write(Unknown Source)
    at java.io.OutputStreamWriter.write(Unknown Source)
    at java.io.BufferedWriter.flushBuffer(Unknown Source)
    at java.io.PrintStream.newLine(Unknown Source)
    at java.io.PrintStream.println(Unknown Source)
    at one.RecursionTest.getPower(RecursionTest.java:24)
    at one.RecursionTest.getPower(RecursionTest.java:26)
    at one.RecursionTest.getPower(RecursionTest.java:26)
    at one.RecursionTest.getPower(RecursionTest.java:26)

........

方法4:据说可以节省运算时间和一半的运算量,我是在网上搜到的。

源程序:

ContractedBlock.gifExpandedBlockStart.gifView Code
package one;

public class RecursionTest {

/**
*
@param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
RecursionTest rt = new RecursionTest();
int x = 6;
int y = 2;
long result = rt.getPower(x, y);
System.out.println(
"The result of "+x+"'s "+y+" times power = "+result);
}
private long getPower(int n, int m){
assert m >= 0;
if(m == 0) return 1;
if(m == 1) return n;
long temp = getPower(n,m/2);
return m%2 == 0? temp * temp: temp * temp * n;
}
}

方法4的参考出处:http://shenyu.iteye.com/blog/192063

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android应用开发控件——Gallery和ImageSwitcher

Gallery组件主要用于横向显示图像列表,不过按常规做法。Gallery组件只能有限地显示指定的图像。也就是说,如果为Gallery组件指定了10张图像,那么当Gallery组件显示到第10张时,就不会再继续显示了。这虽然在大多数时候没有什么关系…

Windows7搭建FTP文件

Windows7搭建FTP文件 第一步:在任意一盘创建一个共享文件夹,这里我们把它命名为“ftp文件共享”,把需要共享的文件放里面,如图所示 第二步:安装IS组件 开始菜单→控制面板→程序→程序和功能→打开或关闭Windows功能…

Win7搭建http文件共享

Win7搭建http文件共享 作者:莫咸海 第一步:在除C盘以外的盘符中新建一个共享文件夹,命名为“http文件共享”; 将需要共享的文件放在“http文件共享”文件夹中。 第二步:安装IIS组件。开始菜单->控制面板->程序…

以命令方式从ftp服务器上下载和上传文件

** 以命令方式从ftp服务器上下载和上传文件 wang ** 1、“开始”→“运行”,输入“cmd“,打开命令提示符; 2、在命令提示符内输入”ftp“并回车,进入ftp提示符ftp> 3、在ftp>输入 open 192.168.2.5 回车; 如…

在windows环境下ftp服务器的文件上传和下载

在windows环境下ftp服务器的文件上传和下载 mo 一、上传本地文件 第一步:登录FTP服务器。在开始菜单中输入cmd,回车进入。输入ftp进入服务器,输入命令格式:open FTP服务器地址 端口,例如open 192.168.2.5 21 如果FTP端…

运维的未来之路:在技术革命中保持关键地位

在快速发展的IT界,运维工程师向来扮演着无可或缺的角色。他们不仅确保系统的平稳运行,还需要及时应对突发事件,优化各项技术实施。然而,伴随着技术的迭代和新工具的出现,一些人开始担忧35岁成为运维人员的职业半衰期。…

Ogre读取中文路径名的文件失败的解决办法

Ogre的文件读取是使用的标准库的io库读取的,众所周知的是,在vs2005是存在着bug的。因此想要一劳永逸的解决这个办法唯有去修改Ogre的源代码,以下为修改方法:打开OgreFileSystem.cpp文件,找到FileSystemArchive::open方…

硬盘类型的区分

硬盘接口类型的区分 1.IDE接口 IDE接口硬盘,IDE也称之为ATA接口,是一种比较老的接口硬盘,从刚开始生产至今,共推出了7个不同的版本,分别是:ATA-1 3.3MB/s、ATA-2 16.6MB/S、ATA-3 16.6MB/s、ATA-4 33MB/s…

bind配置文件解析

bind配置文件解析 bind作为一般的dns服务器的解析服务。 /etc/named.conf #bind的全局配置文件 /etc/named.rfc1912.zones #域配置文件 /var/named/ #存放zone&arpa文件 /var/log/messages #查看配置过程中出错信息 其中named.c…

tomcat配置多站点

下面关于TOMCAT6.0配置多站点的问题怎么解决&#xff1f; [互联网 Windows ] 收藏 转发至天涯微博 悬赏点数 10 3个回答 夏洛叶 2009-02-08 09:26:30 在F:\Tomcat 6.0\conf\server.xml配置是这样的,想同时启动5个站点, <Host name"bbb" debug"0" appB…

线程同步与异步套接字编程

1.利用事件对象来实现线程间的同步 新建一个win32 console application,取名Event,再建一个Event源文件&#xff0c;编辑&#xff1a; #include <iostream.h> #include <windows.h> DWORD WINAPI Fun1Proc(LPVOID lpParameter); DWORD WINAPI Fun2Proc(LPVOID lp…

电脑数据存储工具----光盘驱动器

作者&#xff1a;Liuweifei 电脑数据存储工具----光盘驱动器 光盘驱动器简称光驱&#xff0c;是电脑用来读写光盘内容的设备&#xff0c;也是在台式机和笔记本电脑里比较常见的一个硬件&#xff0c;随着移动存储设备的快速发展&#xff0c;光驱逐渐被其取代。 1. 光驱的类型…

认识和选购显卡

作者&#xff1a;Liuweifei 认识和选购显卡 显卡一般是一块独立的电路板&#xff0c;插在主板上接收由主机发出的控制显示系统工作的指令和显示内容的数字信号&#xff0c;然后通过输出模拟&#xff08;或数字&#xff09;信号控制显示器显示各种字符和图形&#xff0c;它和显…

多媒体融合通信平台促进公网和专网的互联互通

在发生诸如地震、洪涝灾害以及极端天气的情况下&#xff0c;由于通信设施和电力设施最容易遭到破坏&#xff0c;因此&#xff0c;在进行应急救援时&#xff0c;相关指挥部门最先想到的就是进行相应设施的抢修。 公网抢修成功&#xff0c;所有相关抢险救灾者都可以实现互相通话&…

ECMAScript 的未来:预测 JavaScript 创新的下一个浪潮

以下是简单概括关于JavaScript知识点以及一些目前比较流行的比如&#xff1a;es6 想要系统学习&#xff1a; 大家有关于JavaScript知识点不知道可以去 &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&…

利用Visio 2007图形化项目进度和项目跟踪

课程类型 Microsoft Office Visio 2007 视频时长 120分钟 播放 课程资料 课程简介&#xff1a; 在进行项目管理时&#xff0c;项目经理将使用Microsoft Project对项目进行规划、资源分配、成本控制和项目状态跟踪。但是&#xff0c;项目中的数据如何能够通过更图形化的方式呈…

VRP 的发展

随着网络技术和应用的飞速发展&#xff0c;VRP 平台在处理机制、业务能力、产品支持等方面也在持续演进。由于平时也接触到了这几个版本的平台&#xff0c;也常不知道所以然&#xff0c;特找了些资料整理了一下。主要列举了VRP 发展历程中的几个主要版本。 VRP 发展历程 各版本…

PHP学习——定界符格式引起的错误

下面是一个错误的代码&#xff0c;能看出哪里出错了么&#xff1f;&#xff1f;对于我这个初学者什么都是蒙蒙懂的&#xff0c;真的无从下手&#xff0c;但是真的要自己尝试了才知道哪里错了&#xff0c;书和教程都不会告诉我哪里错了 错误代码&#xff1a;Parse error: syntax…

PHP之数组学习

对于网页编程来说&#xff0c;最重要的就是存取和读写数据了。存储方式可能有很多种&#xff0c;可以是字符串、数组、文件的形式等&#xff0c;今天学习了数组&#xff0c;可以说是PHP的数据应用中较重要的一种方式。PHP的数组函数众多&#xff0c;下面是我学习的小结&#xf…

mysql Error 1045(28000)

2019独角兽企业重金招聘Python工程师标准>>> 在windows操作系统安装mysql数据库&#xff0c;碰到Error 1045(28000) Access Denied for user rootlocalhost (Using password:NO)错误时&#xff0c;你需要重新设置密码。 具体方法是&#xff1a; 1.先在安装目录找到m…