<蓝桥杯系列> 关于递归的深究

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

 


前言

递归在蓝桥杯的比赛中非常重要。

一、关于递归的基础问题

1.求阶乘

2.打印从i-j的所有数字

3.数组求和

4.字符串逆转

5.斐波那契数列

6.求最大公约数

二、切蛋糕式求递归

1.求阶乘

代码如下:

public class Recursion {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		System.out.print(f1(3));

	}
	//求阶乘
	private static int f1(int i)
	{
		if(i==1)
		{
			return 1;
		}else {
			return i*f1(i-1);  
		}
	}

}

解决思路:

这种题目就是找到递归切下去的那个点 和终结递归的条件。

2.打印从i—j的所有整数

代码如下(示例): 

public class Recursion {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		f2(3,6);
		

	}
	//打印从i-j所有的整数
	private static void f2(int i,int j){
		if(i>j)
		{
			return;
		}else {
			System.out.print(" "+i);
			f2(i+1,j);
		}
	}
}

解决思路:

和上面的阶乘问题一样,不过就是把返回值 变成了打印 然后 寻找递归的要素。

3.数组求和

代码如下(示例): 

public class Recursion {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		System.out.println(f3(new int[]{1,3,4,5},3));

	}
	//数组求和
	private static int f3(int arr[],int i) {
		if(i==0) {
			//终止条件
			return arr[i];
			
		}else{
			return arr[i]+f3(arr,i-1);
		}
	}
}

解决思路:

类比阶乘的算法,把整个数组切成最后一个元素和前面的所有元素,然后以此递推。

4.字符串逆转

代码如下(示例): 

public class Recursion {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		System.out.println(f4("abcdefg",6));
		
	}
	//字符串逆转   

	private static String f4(String str,int end)
	{
		if(end==0) {   
			return str.charAt(0)+"";
		}else {
			return str.charAt(end)+f4(str,end-1);
		}
	}
}

总结

上面几个经典的递归案列,都是对寻找到递归的终止条件以及递归重复的那一部分,然后进行循环去切蛋糕。

比如:求数组之和与数组的阶乘 字符串的逆转,都是找到了终止(条件为0的时候),然后把前面几部分按规律切下去。

三、寻找规律求递归

1.公式法求递归

代码如下:

public class Recursion {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		System.out.println(f5(7));
		

	}
	//斐波那契数列

	private static int f5(int i)
	{//斐波那契数列 为  1 1 2 3 5 8 13
	//公式为  f(i-1)+f(i-2)
		if(i<3){
			
			return 1;
		}else {
			return f5(i-1)+f5(i-2);
		}
	}

}

解决思路:

根据数列 寻找公式 然后进行公式法处理

2.求最大公约数

代码如下(示例): 

public class Recursion {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		System.out.println(f6(3,7));
		

	}
	/*最大公约数
	  首先用 m%n  如果整除了 那就返回n
	  如果未整除 就用n%余数 
	  直到余数为0
	  返回
	  */
	private static int f6(int m,int n) { //理解的不够透彻
		if(n==0)
			return m;
		return f6(n,m%n);
	}

}

解决思路:

辗转相除法: 先利用他们之间的关系,然后找到递归的规律。

 

总结


我们都在用尽全力失去某个我们最爱的人。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
using Autodesk.Navisworks.Api; using System.Collections.Generic; using System.Threading.Tasks; public static List<ModelItem> GetAllNodes() { List<ModelItem> nodes = new List<ModelItem>(); Document doc = Autodesk.Navisworks.Api.Application.ActiveDocument; // 获取当前文档结构树的根节点 ModelItemCollection rootItems = doc.Models.RootItemDescendants; // 使用多线程遍历根节点下的所有子节点 Parallel.ForEach(rootItems, (rootItem) => { // 将当前节点添加到列表中 lock (nodes) { nodes.Add(rootItem); } // 如果当前节点有子节点,则归获取所有子节点 if (rootItem.Children.Count > 0) { List<ModelItem> childNodes = GetAllChildNodes(rootItem); lock (nodes) { nodes.AddRange(childNodes); } } }); return nodes; } private static List<ModelItem> GetAllChildNodes(ModelItem parent) { List<ModelItem> childNodes = new List<ModelItem>(); // 使用多线程遍历当前节点的所有子节点 Parallel.ForEach(parent.Children, (child) => { // 将当前节点添加到列表中 lock (childNodes) { childNodes.Add(child); } // 如果当前节点有子节点,则归获取所有子节点 if (child.Children.Count > 0) { List<ModelItem> grandchildNodes = GetAllChildNodes(child); lock (childNodes) { childNodes.AddRange(grandchildNodes); } } }); return childNodes; } 此代码属于Navisworks 二次开发,获取当前文档结构树全部节点,存储在list<ModelItem>里,要求执行速度要快,优化这段代码。目前代码执行出现数据缺失。
06-12

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值