递归函数之JAVA演绎

递归|函数

1、递归函数的定义:

答:递归函数即自调用函数,在函数体内直接或间接的调用自己,即函数的嵌套是函数本身。

2、递归方式:递归调用有直接递归和间接递归两种方式。

A:直接递归:在函数中出现调用函数本身。

示例1:下面代码求斐波那契数列第n项,斐波那契数列第一和第二项是1,后面每一项是前两项之和,即1、1、2、3、5、8、13 ...。

程序代码:

public class Test {

public static void main(String args[]) {

int x1 = 1;

int sum = 0;

int n = 7;

for (int i = 1; i <= n; i++) {

x1 = func(i);

sum = sum + x1;

}

System.out.println("sum=" + sum);

}

public static int func(int x) {

if (x > 2)

return (func(x - 1) + func(x - 2));

else

return 1;

}

}

B:间接递归:指函数中调用了其他函数,而该其他函数有调用了本函数。

示例2:用间接递归来计算上述斐波那契数列。

程序代码:

public class Test {

public static void main(String args[]) {

int x1 = 1;

int sum = 0;

int n = 7;

for (int i = 1; i <= n; i++) {

x1 = func1(i);

sum = sum + x1;

}

System.out.println("sum=" + sum);

}

public static int func1(int a){

int b;

b=func2(a);

return b;

}

public static int func2(int b) {

if (b> 2)

return (func1(b - 1) + func1(b - 2));

else

return 1;

}

}

3、为什么要用递归函数?递归函数的缺点是什么?

答:递归的目的是简化程序设计,使程序易读。

示例3:下面不用递归函数继续来计算上述斐波那契数列。

程序代码:

public class Test {

public static void main(String args[]) {

int n=7;

int a=1, b=1, temp;

int sum=2;

for(int i=3; i<=n; i++){

temp=a+b; a=b; b=temp;

sum=sum+temp;

}

System.out.println("sum=" + sum);

}

}

从上面例子我们可以发现虽然非递归函数效率高,但较难编程,可读性较差。递归函数的缺点是增加了系统开销,也就是说,每递归一次,栈内存就多占用一截。

4、递归的条件:

答:需有完成任务的语句,需满足递归的要求(减小而不是发散)。

5、递归进阶:

示例4:

编程求解:若一头小母牛,从出生起第四个年头开始每年生一头母牛,按次规律,第n年时有多少头母牛?

程序代码:

public class Test3 {

public static void main(String args[]) {

int n=10; //要查看的年数

System.out.println("共有"+cattle(n)+"头小母牛!");

}

public static int cattle(int n){

if(n<=0)

return 0;

if(n<=3)

return 1;

return cattle(n-1)+ cattle(n-3);//此处是递归要好好理解。

}

}

规律:此类问题的递归函数为:

如果要求的是从出生起第四个年头,则递归函数为cattle(n-1)+ cattle(n-3),

如果要求的是从出生起第五个年头,则递归函数为cattle(n-1)+ cattle(n-4),

。。。。

依次类推。

(原代码全部在JBuilderX下调试通过)

时间: 2024-10-01 05:49:55

递归函数之JAVA演绎的相关文章

我是java初学者,大神帮忙解答我写的递归函数哪里错了?

问题描述 我是java初学者,大神帮忙解答我写的递归函数哪里错了? package com.jian.action; public class Action { static int count = 0,i=0; public static void digui(String num){ char[] num1 = num.toCharArray(); if(count<num1.length-1){ if (num1[i]=='a') { count++; }i++; System.out.p

Java Learn Steps

我个人的经验,学习java应分以下几个阶段: java的语法学习 面向对象观念的建立 java基本类库的学习 学习设计模式 应用设计模式 经过大量的实践,可以设计模式 以上六个阶段,其中前三个阶段是针对java的,但java中,在很多设计模式的应用,同时有很多功能都支持设计模式,所以不懂设计模式的人是不会很好的应用java做开发的.第4.5个阶段的学习在前三个阶段的基础上,学习.应用成功的经验.从而进入第六个阶段,在软件设计这个领域尽情发挥.本人受能力所限,还处在第4个阶段的学习过程,所以会对前

我学习使用java的一点体会

2002年初,因为公司的业务需要而学习java,并应用java开发项目.由于项目时间紧,没有充裕的时间系统学习java,对java的学习只能是项目需要用什么,就学什么,这种学习方法的上手快,但不扎实,在以后的工作中,因为java学的不扎实,吃了不少苦头.现在我学习应用java已经有一年半的时间,对java已经有了一定的体会,把自己的体会写出来,供网友分享. 以我个人的经验,学习java应分以下几个阶段: java的语法学习 面向对象观念的建立 java基本类库的学习 学习设计模式 应用设计模式

仅用递归函数和栈逆序一个栈

package stackAndQueue; import java.util.Stack; import org.junit.Test; /** * 仅用递归函数和栈逆序一个栈:ReverseStack[2] * * [一个栈依次压入1.2.3,将栈转置,使栈顶到栈底依次是1.2.3,只能用递归函数,不能借用额外的数据结构包括栈] * * 算法思想:两个递归函数(getAndRemoveBottom.reverse) * * @author xiaofan */ public class Re

JVM学习(1)——通过实例总结Java虚拟机的运行机制

JVM的历史 JVM的运行流程简介 JVM的组成(基于 Java 7) JVM调优参数:-Xmx和-Xms 逃逸分析(DoEscapeAnalysis )的概念--JVM栈上分配实验 JVM中client模式(-client)和server模式(-server)的区别 查看GC日志的方法 使用idea对JVM进行参数输入 Java栈,Java堆和方法区的交互原理 为了能让递归方法调用的次数更多一些,应该怎么做?   当今--截止本文总结之前,使用最为广泛的 JVM 为 HotSpot(HotSp

菜鸟来提问啦。关于用java循环实现复利的问题。

问题描述 菜鸟来提问啦.关于用java循环实现复利的问题. 大家好:题目如下: 假设每个月向银行存入100美元.每月利率是0.00417 第一个月后账户上的金额为: 100*(1+0.00417)=100.417元 第二个月后账户上的金额为: (100+100.417)*(1+0.00417)=201.252元 第三个月后账户上的金额为: (100+201.252)*(1+0.00417)=302.507元 编写程序显示6个月后的金额.希望能用循环来解答这个问题.有其他更好的方法的也欢迎指点一下

Java动态代理学习2——静态代理和动态代理并对照spring的通知

  一.代理模式  代理模式是常用的java设计模式,特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务.  按照代理的创建时期,代理类可以分为两种: 静态代理:由程序员创建或特定工具自动生成源代码再对其编译.在程序运行前代理类的.class文件就已经存在了. 动态

Java之恋

初次见面那是一个河北的夏天风随沙散落天涯蝴蝶依旧恋着花回首走过的日子手指和键盘之间的梦想之光已恍如昨日 那年我还是一个刚踏进这个曾经只在地理课本上狂念南稻北麦,南油北花的土地那年你只是我必须要学的编程语言每天晚上511痴情相伴的黑夜每天淡紫色蒲公英飞舞的师院我静静地坐在电脑前照着课本慢慢敲着键看代码一行两行直至宝贝计划的出现 看十一教门前人面桃花相映红晕染你微笑的脸java的会面让我明白封装之义多态之美还有继承在中间人月神话带我领略编程之美程序之艰我像是一个孩子总是摔倒总是埋怨机房收费系统让我举

groovy/java自实现json解析器(1)绪论

groovy是一门以java为基础的动态语言,它强大地动态特性为我们的敏捷开发带来了极大的便利,下面是一个由grovvy(完美兼容嵌套java实现的json)解析器的部分代码展示,我们都知道,json字符串只要满足格式要求,那么它是可以无限循环嵌套的,而本解析器的核心实现就是大量的递归函数运用,将json字符串一层层地解析开,并拼装成我们相应的数组或对象.它主要由以下五个类组成: --JsonObject.groovy --JsonArray.groovy --JsonTool.groovy -