一个方法在执行过程中调用自身, 就称为 “递归”.
递归相当于数学上的 “数学归纳法”, 有一个起始条件, 然后有一个递推公式.
递归的注意点:
1.程序调用自己
2.这个递归程序一定要有一个趋近于中止的条件.
3.核心:写递归程序的时候,需要自己来推导一个递推公式.
例:
我们求 N!
起始条件: N = 1 的时候, N! 为 1. 这个起始条件相当于递归的结束条件.
递归公式: 求 N! , 直接不好求, 可以把问题转换成 N! => N * (N-1)!
代码实现:
import java.util.Scanner;
public static int fac(int n){
if(n==1){
return 1;
}
return n*fac(n-1);
}
public static void main5(String[] args){
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int ret = fac(N);
System.out.println(ret);
}
??递归的程序的执行过程不太容易理解, 要想理解清楚递归, 必须先理解清楚 “方法的执行过程”, 尤其是 “方法执行结束之后, 回到调用位置继续往下执行”.
??下面我们通过一系列的代码练习来熟悉方法递归地使用.
题目要求
按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)
实现代码
public static void print(int n){
if(n>9){
print(n/10);
}
System.out.print(n%10+" ");
}
public static void main(String[] args){
int a = 1234;
print(a);
}
题目要求:
递归求 1 + 2 + 3 + … + 10
实现代码
public static int sumption(int n){
if(n==1){
return 1;
}
return n+sumption(n-1);
}
public static void main(String[] args) {
int n = 10;
int ret = sumption(n);
System.out.println(ret);
}
题目要求:
递归求 N 的阶乘
实现代码
import java.util.Scanner;
public static int fac(int n){
if(n==1){
return 1;
}
return n*fac(n-1);
}
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int ret = fac(N);
System.out.println(ret);
}
题目要求:
求斐波那契数列的第 N 项
实现代码
import java.util.Scanner;
public static int fibonaci(int n){
if(n==1){
return 0;
}else if(n==2){
return 1 ;
}
return fibonaci(n-1)+fibonaci(n-2);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int fib = fibonaci(n);
System.out.println(fib);
}
题目要求
实现代码:求解汉诺塔问题(提示, 使用递归)
实现代码
public static void move(char n1,char n2){
System.out.println(n1+"->"+n2);
}
public static void hannoi(int n,char pos1,char pos2,char pos3){
if(n==1){
move(pos1,pos3);
}else{
hannoi(n-1,pos1,pos3,pos2);
move(pos1,pos3);
hannoi(n-1,pos2,pos1,pos3);
}
}
public static void main(String[] args){
int n = 3;
char a='A';
char b='B';
char c='C';
hannoi(n,a,b,c);
}
??注意点: 不了解汉诺塔游戏及解题思路的同学可以看我的往期博客——汉诺塔问题详解
题目要求:
实现代码: 青蛙跳台阶问题(提示, 使用递归)
实现代码
import java.util.Scanner;
public static int jump(int n){
if(n==1){
return 1;
}else if(n==2){
return 2;
}else{
return jump(n-1)+jump(n-2);
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int ret = jump(n);
System.out.println(ret);
}
??注意点: 不了解青蛙跳台阶游戏及解题思路的同学可以看我的往期博客——青蛙跳台阶问题
递归是一种重要的编程解决问题的方式.
有些问题天然就是使用递归方式定义的(例如斐波那契数列, 二叉树等), 此时使用递归来解就很容易.
有些问题使用递归和使用非递归(循环)都可以解决. 那么此时更推荐使用循环, 相比于递归, 非递归程序更加高效.
??好了,这次Java方法递归的知识就分享到这里了,希望大家多多练习,谢谢大家的欣赏!
项目中用到的一些特殊字符和图标 html代码 XML/HTML Code 复制内容到剪贴板 div ...
DELETEFROMTablesWHEREIDNOTIN(SELECTMin(ID)FROMTablesGROUPBYName) Min的话保...
工具:Eclipse,Oracle,smartupload.jar;语言:jsp,Java;数据存储:Oracle。...
正则忽略大小写 – RegexOptions.IgnoreCase 例如: 复制代码 代码如下: Str = R...
错误描述: 在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报...
本文实例讲述了Laravel框架源码解析之反射的使用。分享给大家供大家参考,具体如...
上篇文章给大家介绍了 Java正则表达式匹配,替换,查找,切割的方法 ,接下来,...
Elasticsearch 是通过 Lucene 的倒排索引技术实现比关系型数据库更快的过滤。特...
4月11日20:30~22:00通过腾讯会议进行了第二次在线学习讨论我把学习笔记整理一下...
复制代码 代码如下: % URL="http://news.163.com/special/00011K6L/rss_newstop....