Java递归求费数列和_简述java递归与非递归算法,0-100求和,斐波那契数列,八皇后,汉诺塔问题...

本文详细介绍了Java中的递归算法,包括递归的概念、设计关键和注意事项。通过实例展示了递归在解决斐波那契数列、0-100数字求和以及八皇后问题中的应用。同时,对比了递归与非递归算法的优缺点,强调在适当场景选择合适的方法。
摘要由CSDN通过智能技术生成

一:什么是递归算法?

递归算法就是直接或者间接的调用自己的方法,在达到一个条件的时候停止调用(递归出口),所以一定要找准好条件,让递归停止,否则就会是无限进行下去

二:递归程序设计的关键

1:找出调用中所需要的参数

2:返回的结果

3:递归调用结束的条件

三:递归程序注意

1:要有方法中自己调用自己

2:要有分支结构

3:要有结束的条件

四:简单叙述递归函数的优缺点

优点:

1:简洁清晰,实现容易,可读性好

2:在遍历的算法中,递归比循环更为简单

缺点:

1:效率低,使用递归函数是有空间和时间的消耗的。并且很多计算都是重复的,对性能有较大的影响

2:可能导致调用栈的溢出,每一次函数调用,在内存栈中分配空间,而每一个栈的容量是有限的,当递归的层级太多的时候,超出栈的容量,就会导致栈溢出。

3:递归函数需要系统的堆栈,空间消耗比非递归的要消耗很多,并且深度太大的话,系统可能会支撑不住

五:注意

a.简单的用循环,复杂的用递归(可以实现大部分相关问题)

b.有规律的问题,循环不方便时,使用递归是不错的建议。

c.循环方法比递归方法快,避免了一系列函数的调用,返回中涉及参数传递,返回值的额外开销,每递归一次,栈内存就多占用一截

d.能用循环,就尽量不要用递归.......

e.当递归中出现分支结构的时候(可以出现多个分支),注意每一个分支结构都要有结束条件。

f.只要函数调用了自己,不论间接或者直接,都算递归。

g.非递归函数效率高,但是较难编程,可读性较差

六:相关递归问题

1:  斐波那契数列

for循环:1 import java.util.Scanner;

2 public class Day1{

3 public static void main(String[] args){

4 System.out.println("请输入位数所显示的数字:");

5 Scanner sc = new Scanner(System.in);

6 int x = sc.nextInt();

7 int x1 = 1;

8 int x2 = 1;

9 int x3 = 0;

10 int add = 2;

11 System.out.printf("数列分别为:\n1\t1\t");

12 for(int i = 1;i<=x-2;i )

13 {

14 //因为前两项是一样的,从第三项开始出现不同的数字,所以进行减二

15 //所定义了三个变量,x1代表第一个数字,x2代表第二个数字,x3代表第一个数字与第二个数字的和,所赋予他们的意义不要改变

16 x3 = x1 x2;

17 add = add x3;

18 x1 = x2;

19 x2 = x3;

20 System.out.printf("%d\t",x3);

21 }

22 System.out.println("\n第" x "项数字为:" x3);

23 System.out.println("前" x "项和为:" add);

24 }

25 }

递归算法:1 public class Day1{

2 public static int f(int n){

3 if(n==1||n==2){

4 return 1;

5 }else{

6 return f(n-1) f(n-2);

7 }

8 }

9 public static void main(String[] args){

10 System.out.println(f(5));

11 }

12 }

想法:

递归算法对于一些问题来说是真的简单,斐波那契数列的公式:fn = f(n-1) f(n - 2) (n >= 2),考虑前两个数字的话,就是1,由于从0开始,可以理解为

F0 = 0; F1 = 1; F1 = 1;正好是与计算机相对应

2:  0-100数字进行相加

for循环:1 public class Day1{

2 public static void main(String[] args){

3 int add = 0;

4 for(int i = 0;i <= 100;i ){

5 add = add i;

6 }

7 System.out.println("0-100的和为:" add);

8 }

9 }

递归算法:1 public class Day1{

2 public static int f(int n){

3 if(n>0)

4 return n f(n-1);

5 return 0;

6 }//尽量有一个临界的点,if(n == 1)return 1;else return n f(n-1);

7 public static void main(String[] args){

8 System.out.println("0-100的和为:" f(100));

9 }

10 }

3:八皇后

摘自百度百科,注释比较明细:1 public class Day1 {

2 private int[] column; //同栏是否有皇后,1表示有

3 private int[] rup; //右上至左下是否有皇后

4 private int[] lup; //左上至右下是否有皇后

5 private int[] queen; //解答

6 private int num; //解答编号

7

8 public Day1() {

9 column = new int[8 1];

10 rup = new int[(2*8) 1];

11 lup = new int[(2*8) 1];

12 for (int i = 1; i <= 8; i )

13 column[i] = 0;

14 for (int i = 1; i <= (2*8); i )

15 rup[i] = lup[i] = 0; //初始定义全部无皇后

16 queen = new int[8 1];

17 }

18

19 public void backtrack(int i) {

20 if (i > 8) {

21 showAnswer();

22 } else {

23 for (int j = 1; j <= 8; j ) {

24 if ((column[j] == 0) && (rup[i j] == 0) && (lup[i-j 8] == 0)) {

25 //若无皇后

26 queen[i] = j; //设定为占用

27 column[j] = rup[i j] = lup[i-j 8] = 1;

28 backtrack(i 1); //循环调用

29 column[j] = rup[i j] = lup[i-j 8] = 0;

30 }

31 }

32 }

33 }

34

35 protected void showAnswer() {

36 num ;

37 System.out.println("\n解答" num);

38 for (int y = 1; y <= 8; y ) {

39 for (int x = 1; x <= 8; x ) {

40 if(queen[y]==x) {

41 System.out.print("Q");

42 } else {

43 System.out.print(".");

44 }

45 }

46 System.out.println();

47 }

48 }

49

50 public static void main(String[] args) {

51 Day1 queen = new Day1();

52 queen.backtrack(1);

53 }

54 }

汉诺塔问题:

稍后继续编辑,由于零散时间写的博客,过两三天就会补齐

七:总结

贵在坚持吧,最近被些事情忙怀了,毫不夸张的说,感觉生活下去的勇气都是断断续续的,有朋友不断的鼓励我,天将降大任于斯人也,必须苦其心志,劳其筋骨。

说句最现实的话,努力了真的是不一定成功,真的是需要一定的机遇的,但是努力的目的是什么?就是当机遇降临到你的身上的时候,你是否能抗的住它呢?努力就会给你力量!

加油!要走出属于自己的道路来!来源:http://www.icode9.com/content-1-127501.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值