java遇见的递归

使用递归的方法计算1到100的累加,也就是计算1+2+3+4+........+100。

递归的特点就是递归函数本身会调用自己,对应到逻辑上就是一段逻辑会使用这段逻辑自身。

我们看看如何描叙问题本身,最直观的描叙:“从1开始,后一个数加上前一个数,后一个数是前一个数加一所得,一直加到100”,但这种描叙无法转化为递归的方法。我们试着按递归的思路思考这个问题,“做一件事情的步骤又包含这个事情步骤的自身”:

  1. 最开始一定是“1”+“某个值
  2. 如果按老思路,这个“某个值”是“1”再加"1",也就是“2”
  3. 到这里,已经完成了一段步骤,并且如果这种思路能形成递归,上面的两步的描叙里面应该会包含对自身同样步骤的一段描叙,但我们仔细想想,里面却没有。
  4. 那我们换个角度思考一下,这个“某个值"也可以是‘2’到‘100’累加的和。到这里,我们看到了点希望,因为”累加的和“这个词就是第1、2步在做的事。
  5. 那么‘2’到‘100’累加的和又应该是‘2’加上”‘3’到‘100’累加的和“,这里我们已经看到递归的迹象了。
  6. 再举一例看看,‘3’到‘100’累加的和又应该是‘3’加上”‘4’到‘100’累加的和“
  7. 对于递归,还有最重要的一点就是这种嵌套何时终止,不然就无穷无尽了。我们看看最后一步,也就是‘100‘到’100‘累加的和是多少?这次我们不用,也无法递归调用了,结果应该直接就是100,所以到这一步,递归终止。

对于整个问题,我们可以进一步抽象为用递归法求两个正整数(m,n)累加和的问题,我们还要考虑m<n, m=n, m>n这三种参数传入方式不同的情况。下面是我写的java代码,以供参考:

public class test {
	public static void Main(String[] args) {

		System.out.println("The Result of Accoumulation from 1 to 100 is:" + Accoum(1, 100));
		System.out.println("The Result of Accoumulation from 1000 to 1 is:" + Accoum(1000, 1));
		System.out.println("The Result of Accoumulation from 80 to 80 is:" + Accoum(80, 80));
	}

	/**
	 * @param m
	 * @param n
	 * @return
	 */
	private static Integer Accoum(int m, int n) {
		// 对于接受的参数,要考虑m >n,m=n,m<n三种情况。
		if (m < n) {
			return (m + Accoum(++m, n)); // 如果m<n,返回“m”加上“m+1到n累加的和”
		} else if (m > n) {
			return (m + Accoum(--m, n)); // 如果m.n,返回“m”加上“m-1到n累加的和”
		} else {
			return n; // 如果m=n,直接返回n,这是递归的关键。
		}
	}
}


项目中的代码 留着自己看

private void setValues(Depart depart, DepartForm form) {		
		depart.setParent(departDao.get(form.getParentId()));
		List<Depart> parents = depart.getParents();
		if (parents == null) {
			parents = new ArrayList<Depart>();
		} else {
			parents.clear();
		}
		List<Depart> currentParents = this.generateParents(depart.getParent());
		parents.addAll(currentParents);
		depart.setParents(parents);
	}

	/**
	 * @param depart
	 * @return
	 */
	private List<Depart> generateParents(Depart parent) {
		List<Depart> parents = new ArrayList<Depart>();
		if (parent != null) {
			parents.add(parent);
			parents.addAll(this.generateParents(parent.getParent()));
		}
		return parents;
	}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值