习题一:
利用递归计算5个数的和
代码:
public class yyds {
public static void main(String[] args) {
yyds y = new yyds();
System.out.println(y.digui(5));
}
public int digui(int n){
if(n == 1){
return 1;
}else{
return n + digui(n - 1);
}
}
}
习题二:
利用递归计算5个数的乘积
代码:
public class yyds {
public static void main(String[] args) {
yyds y = new yyds();
System.out.println(y.digui(3));
}
public int digui(int n){
if(n == 1){
return 1;
}else{
return n * digui(n - 1);
}
}
}
习题三:
已知有一个数列,f(0) = 1,f(1) = 4;f(n + 2) = 2 * f(n + 1) + f(n);其中n是大于0的整数,求f(10)的值
代码:
public class yyds {
public static void main(String[] args) {
yyds y = new yyds();
System.out.println(y.digui(10));
}
public int digui(int n){
if(n == 0){
return 1;
}else if( n == 1){
return 4;
}else{
return 2 * digui(n - 1) + digui(n - 2);
}
}
}
解析:
① 一定要注意不写死循环,如果按照题目那样两边移位后求f(n),会导致每递归一次,数据就偏离0和1更远一次。递归更多的是n - m的格式。
习题四:
输入一个数据n,计算斐波那契数列的第n个值:1,1,2,3,5,8,13,21,34,55。
规律:一个数等于前两个数之和;要求:计算斐波那契数列的第n个值,并将整个数列打印出来。
代码:
import java.util.Scanner;
public class yyds {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
yyds y = new yyds();
System.out.println("斐波那契的个数:");
int n = in.nextInt();
for(int i = 1;i <= n;i++){
System.out.print(y.f(i) + " ");
}
}
public int f(int n){
//必须要有n == 0时的情况,因为else情况中可以有f(0)。如果此处不写n == 0的情况,则会溢出
if(n == 0){
return 0;
}else if(n == 1){
return 1;
}else{
return f(n - 1) + f(n - 2);
}
}
}
回顾:
① 一定要代入数据,看一下递归的最小变量是0还是1,确定好下限。
习题五:
汉诺塔问题:如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移动一个盘子且大盘子不能在小盘子上面 ,求移动的步骤和移动的次数。
解析:
轻松理解汉诺塔问题(图解java描述)_视学算法的博客-CSDN博客_汉诺塔问题java https://blog.csdn.net/zandaoguang/article/details/76889284?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165284071916782395340929%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165284071916782395340929&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-2-76889284-null-null.142%5Ev10%5Econtrol,157%5Ev4%5Econtrol&utm_term=%E6%B1%89%E8%AF%BA%E5%A1%94java&spm=1018.2226.3001.4187