java中递归算法是什么怎么算的?
发布网友
发布时间:2022-04-23 10:01
我来回答
共7个回答
热心网友
时间:2022-05-14 13:10
一、递归算法基本思路:
Java递归算法是基于Java语言实现的递归算法。递归算法是一种直接或者间接调用自身函数或者方法的算法。递归算法实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法表示问题的解。递归往往能给我们带来非常简洁非常直观的代码形式,从而使我们的编码大大简化,然而递归的思维确实跟我们的常规思维相逆的,通常都是从上而下的思维问题,而递归趋势从下往上的进行思维。
二、递归算法解决问题的特点:
【1】递归就是方法里调用自身。
【2】在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
【3】递归算法代码显得很简洁,但递归算法解题的运行效率较低。所以不提倡用递归设计程序。
【4】在递归调用的过程中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。
【5】在做递归算法的时候,一定把握出口,也就是做递归算法必须要有一个明确的递归结束条件。这一点是非常重要的。其实这个出口就是一个条件,当满足了这个条件的时候我们就不再递归了。
三、代码示例:
public class Factorial {
//this is a recursive function
int fact(int n){
if (n==1) return 1;
return fact(n-1)*n;
}
}
public class TestFactorial {
public static void main(String[] args) {
// TODO Auto-generated method stub
Factorial factorial=new Factorial();
System.out.println("factorial(5)="+factorial.fact(5));
}
}
代码执行流程图如下:
此程序中n=5就是程序的出口。
热心网友
时间:2022-05-14 14:28
Java递归算法是基于Java语言实现的递归算法。递归算法是一种直接或者间接调用自身函数或者方法的算法。递归算法实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法表示问题的解。递归往往能给我们带来非常简洁非常直观的代码形式,从而使我们的编码大大简化,然而递归的思维确实跟我们的常规思维相逆的,通常都是从上而下的思维问题,而递归趋势从下往上的进行思维。
二、递归算法解决问题的特点:
【1】递归就是方法里调用自身。
【2】在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
【3】递归算法代码显得很简洁,但递归算法解题的运行效率较低。所以不提倡用递归设计程序。
【4】在递归调用的过程中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。
【5】在做递归算法的时候,一定把握出口,也就是做递归算法必须要有一个明确的递归结束条件。这一点是非常重要的。其实这个出口就是一个条件,当满足了这个条件的时候我们就不再递归了。
三、代码示例:
代码执行流程图如下:
此程序中n=5就是程序的出口。
Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
热心网友
时间:2022-05-14 16:03
简单点说是在方法中调用自己,直到某一条件退出。
热心网友
时间:2022-05-14 17:54
public String sss(){
if(*******){
sss();
}
}
热心网友
时间:2022-05-14 20:02
递归做为一种算法在程序设计语言中广泛应用.是指函数/过程/子程序在运行过程递归的作用:递归算法可以解决一些通过递归定义的题目。首先需要明白什么是递归
热心网友
时间:2022-05-14 22:27
1.汉诺塔问题
import javax.swing.JOptionPane;
public class Hanoi {
private static final String DISK_B = "diskB";
private static final String DISK_C = "diskC";
private static final String DISK_A = "diskA";
static String from=DISK_A;
static String to=DISK_C;
static String mid=DISK_B;
public static void main(String[] args) {
String input=JOptionPane.showInputDialog("please input the number of the disks you want me move.");
int num=Integer.parseInt(input);
move(num,from,mid,to);
}
private static void move(int num, String from2, String mid2, String to2) {
if(num==1){
System.out.println("move disk 1 from "+from2+" to "+to2);
}
else {
move(num-1,from2,to2,mid2);
System.out.println("move disk "+num+" from "+from2+" to "+to2);
move(num-1,mid2,from2,to2);
}
}
}
2. 这是一个排列的例子,它所做的工作是将输入的一个字符串中的所有元素进行排序并输出,例如:你给出的参数是"abc" 则程序会输出:
abc
acb
bac
bca
cab
cba
(1)算法的出口在于:low=high也就是现在给出的排列元素只有一个时。
(2)算法的*近过程:先确定排列的第一位元素,也就是循环中i所代表的元素,
然后low+1开始减少排列元素,如此下去,直到low=high
public static void permute(String str) {
char[] strArray = str.toCharArray();
permute(strArray, 0, strArray.length - 1);
}
public static void permute(char[] list, int low, int high) {
int i;
if (low == high) {
String cout = "";
for (i = 0; i<= high; i++)
cout += list[i];
System.out.println(cout);
} else {
for (i = low; i<= high; i++) {
char temp = list[low];
list[low] = list[i];
list[i] = temp;
permute(list, low + 1, high);
temp = list[low];
list[low] = list[i];
list[i] = temp;
}
}
}
3。这是一个组合的例子,与上述的例子相似,只是它所做的工作是,输出所给字符串中制定数目的元素的组合种类
(1)程序出口在于n=1,此时只要输出目标数组的所有元素即可
(2)*近过程,当n>1 的时候,我们先取第一个元素放入目标数组中,然后n-1,如此下去,最后出来。
import javax.swing.JOptionPane;
public class Combination {
/**
* @param args
*/
public static void main(String[] args) {
String input = JOptionPane.showInputDialog("please input your String: ");
String numString = JOptionPane.showInputDialog("please input the number of your Combination: ");
int num = Integer.parseInt(numString);
Combine(input, num);
}
private static void Combine(String input, int num) {
char[] a = input.toCharArray();
String b = "";
Combine(a, num, b, 0, a.length);
}
private static void Combine(char[] a, int num, String b, int low, int high) {
if (num == 0) {
System.out.println(b);
} else {
for (int i = low; i<a.length; i++) {
b += a[i];
Combine(a, num - 1, b, i+1, a.length);
b=b.substring(0, b.length()-1);
}
}
}
}
热心网友
时间:2022-05-15 01:08
/**
* 概念介绍:
* 递归是一种方法(函数)调用自已编程技术。
* 递归就是程序设计中的数学归纳法。
* 例如:tri(n)=1 if n=1
* tri(n)=n+tri(n-1) if n>1
* 可能while循环方法执行的速度比递归方法快,但是为什么采用递归呢。
* 采用递归,是因为它从概念上简化了问题,而不是因为它提高效率。
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Recursion {//求三角数字的递归算法:1,3,6,10,15,21, ......
static int theNumber;
public static void main(String[] args) throws IOException {
System.out.print("Enter a number: ");
theNumber = getInt();
//使用递归时调用,默认
int theAnswer = triangle(theNumber);
//使用非递归时调用
//int theAnswer=triangle2(theNumber);
System.out.println("Result: " + theAnswer);
}
public static int triangle(int n) {//递归方法,循环调用
if (n == 1) {
return 1;
} else {
return (n + triangle(n - 1));
}
}
public static int triangle2(int n) {//非递归方法
int total = 0;
while (n > 0) {
total = total + n--;
}
return total;
}
public static String getString() throws IOException {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = br.readLine();
return s;
}
public static int getInt() throws IOException {
String s = getString();
return Integer.parseInt(s);
}
}
/**
* 运行结果:
* Enter a number:
* 3
* Result: 6
*/
/**
* 总结:
* 使用非递归的方式更简洁,更易懂,运行效率更高,为什么还要用递归的算法呢。
* 递归使规模逐渐降低的方式解决问题,以这种统一的方式解决足够复杂的问题。
*/
java中递归算法是什么怎么算的?
Java递归算法是基于Java语言实现的递归算法。递归算法是一种直接或者间接调用自身函数或者方法的算法。递归算法实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法表示问题的解。递归往往能给我们带来非常简洁非常直观的代码形式,从而使我们的编码大大简化,然而递归的思维确实跟我们的常规思维相逆...
谁能说说JAVA的递归是什么意思?
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于...
Java 算法篇-深入理解递归(递归实现:青蛙爬楼梯)
1.0 递归介绍:递归是函数自行调用自身的过程,可用于解题如斐波那契数列或计算阶乘。递归依赖两种情况:基本情况提供直接解答,递归情况分解问题到较小规模,直至终止。递归执行包括“递出”创建新栈帧直至满足停止条件,“回归”执行直至销毁所有帧。理解为问题自解过程的反复调用。2.0 递归实现示例:- *...
java 递归算法问题:(n,k)=(n-1,k-1)+(n-1,k)?
就是说 n 个里面要选 k 个,分为两组,包含 A和不包含A。包含 A : 已经包含A了,所以总数是 n-1 个了;同理,已经包含了A,所以只要选 k -1 个就可以了,所以为 (n-1,k-1)。不包含A:已经不包含A了,所以总数是 n-1 个;还是选 k个,所以为(n-1,k)。无限递归即可以了。
用java冒泡排序和递归算法
递归算法,就是程序的自身调用。表现在一段程序中往往会遇到调用自身的那样一种coding策略,可以利用大道至简的思想,把一个大的复杂的问题层层转换为一个小的和原问题相似的问题来求解的这样一种策略。能看到我们会用很少的语句解决了非常大的问题,所以递归策略的最主要体现就是小的代码量解决了非常复杂...
Java数据结构二叉树深度递归调用算法求内部算法过程详解
根据上面的二叉树代码,递归过程是:f(1)=f(2)+1 > f(3) +1 ? f(2) + 1 : f(3) +1 f(2) 跟f(3)计算类似上面,要计算左右结点,然后取大者 所以计算顺序是f(4.left) = 0, f(4.right) = 0 f(4) = f(4.right) + 1 = 1 然后计算f(5.left) = 0,f(5.right) =...
Java用递归实现3.根据规律写出计算算法:1、7、8、15、23、38、61...
• 第一项是1,第二项是7,从第三项开始,每一项是前两项的和;• 因此,第三项是8,第四项是15,第五项是23,以此类推。这是一个典型的递归问题,可以通过递归算法来解决。具体实现代码如下:在上面的代码中,我们定义了一个getNumber方法,该方法接受一个整数n作为参数,返回数列中...
用java递归算法求一个数字的阶乘
递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数).3、特点:(1) 递归就是在过程或函数里调用自身。(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口...
java递归方法
param direction 递归时的方向 / public static void printStar2(int number,int oldNumber, int direction){ if(number==0)direction++;String s="";int i = number;if(direction==1){ for(;i<oldNumber;i++){ s+="*";} number--;}else{ for(;i<oldNumber;i++){ s+="*";} ...
用java递归算法,求1+2+4+8+~~~的和?
即f(x)=f(x-1)*2;f(1)=1;...public class Test4 { public static void main(String[]args){ System.out.println(num(10));} public static int f(int x){ if(x == 1)return 1;return f(x - 1)*2;} public static int num(int x){ if(x == 1)return f(1);return...