蓝桥杯学习——简单递归(阶乘、数组求和、翻转字符串,斐波那契)

递归:在代码上就是自己调用自己

public class diguiapp {
	public static void main(String args[]) {
		fun(10);
	}
	static void fun(int i) {
        //当i<0时结束递归
		if(i<0)
			return;
		
		fun(i-1);
	}
}

求n的阶乘

1.找重复:n!=n*(n-1)!,即要想知道n!,就要先求(n-1)!

                 (n-1)!=(n-1)*(n-2)!即要想知道(n-1)!,就要先求(n-2)!

以此类推

2.找变化:变化的量作为函数的参数

3.找边界:出口,当n=1时,结束

public class diguiapp {
	public static void main(String args[]) {
		System.out.print(fun(10));
	}
	static int fun(int n) {
		if(n==1)
			return 1;
		//已知,fun(n)是用来求n!,那么fun(n-1)就是用来求(n-1)!
		return n*fun(n-1);
	}
}

打印1-100

1.找重复:要想打印1-100,就要先打印1-99,再打印100

                要想打印1-99,就要先打印1-98,再打印99

                以此类推

2.找变化:变化的量作为函数的参数

3.找边界:出口,当n=1时,结束

package learn;

public class diguiapp {
	public static void main(String args[]) {
		print(100);
	}

	
	static void print(int n) {
		if(n==0) 
			return;

		//已知,print(n)是用来打印1-n的,那么print(n-1)就是用来打印1-(n-1)的
		print(n-1);
		//打印完前面的1-(n-1)之后,打印n
		System.out.print(n+" ");
	}
}

数组求和

1.找重复:要想求下标从0-9的数组的和,可以先求0-8的和,再加上下标为9上的数

                要想求下标从0-8的数组的和,可以先求0-7的和,再加上下标为8上的数

                以此类推

2.找变化:变化的量作为函数的参数

3.找边界:出口,当n=0时,结束

public class diguiapp {
	public static void main(String args[]) {
		int[]a= {1,2,3,4,5,6,7,8,9,10};
		System.out.print(addarray(a,0));
	}
	
	static int addarray(int a[],int index) {

		if(index==a.length-1)
			return a[index];

		return a[index]+addarray(a,index+1);
	}
}

翻转字符串

1.找重复:

想要翻转长度为length的字符串,先翻转第1—到length-1的,再将length位置的拼在前面

想要翻转长度为length-1的字符串,先翻转第1—到length-2的,再将length-1位置的拼在前面

以此类推

2.找变化:变化的量作为函数的参数

3.找边界:出口,当只有一个字符时,就不用翻转了

public class diguiapp {
	public static void main(String args[]) {
		System.out.print(reverse("abcdefg","abcdefg".length()-1));
	}
	
    static String reverse(String s,int index) {

		if(index==0)
			return String.valueOf(s.charAt(index));

		return String.valueOf(s.charAt(index))+reverse(s,index-1);
	}
	
}

斐波那契数列,求某一项的值

斐波那契数列:除前两项,后面每项是前两项的和

1.找重复:

已知f(n)=f(n-1)+f(n-2),要求f(n),要先求f(n-1)和f(n-2)

f(n-1)=f(n-2)+f(n-3),要求f(n-1),要先求f(n-2)和f(n-3)

f(n-2)=f(n-3)+f(n-4),要求f(n-2),要先求f(n-3)和f(n-4)

以此类推

2.找变化:变化的量作为函数的参数

3.找边界:出口,当n<2时,为1

public class diguiapp {
	public static void main(String args[]) {

		System.out.print(fib(10));
	}
	
	static int fib(int n) {
		if(n<=2)
			return 1;

		return fib(n-1)+fib(n-2);
	}
}

辗转相除法求最大公约数

1.找重复:

对于两个数,如果m%n=0那么最大公约数就是n

如果m%n≠0,那么k=m%n

做n%k,如果n%k=0那么最大公约数就是k

如果n%k≠0,那么k=m%n,做n%k

以此类推

2.找变化:变化的量作为函数的参数

3.找边界:出口,如果m%n=0那么最大公约数就是n

public class diguiapp {
	public static void main(String args[]) {
		System.out.print(max(24,4));
	}
	
	static int max(int m,int n) {
		if(m%n==0)
			return n;
		m=m%n;
		return max(n,m);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值