package com;
/**
* 五只猴子采得一堆桃,它们约定次日早起来分。半夜里,一只猴子偷偷起来,把桃均分成五堆后,
* 发现还多一个,它吃了这桃子,拿走了其中一堆。第二只猴子醒来,又把桃子均分成五堆后,
* 还是多了一个,它也吃了这个桃子,拿走了其中一堆。第三只,第四只,第五只猴子都依次如此做了。
* 问桃子数最少有多少个?
* 要求:(1)使用面向对象编程! (2)使用递归的方法编写!
*
* @author rainv
*
*/
public class Monkey {
private int cycle=0;
public static void main(String[]args){
System.out.println(" The result is "+-1%5);
Monkey m=new Monkey();
for(int i=1;i>0;i++){
long rs=m.assign(i, 6, 0);
if(rs!=0){
System.out.println("...The min result is "+i);
break;
}
m.cycle=0;
}
}
/**
*
* @param average 可控制枚举范围的桃子总数
* @param num 猴子的只数
* @param status 状态参数,替代全局变量
* @return
*/
public long assign(long average,int num,int status){
if(status>num){
return 0;
}
long mid=average-1;
if(mid<=1 || (mid%num)!=0){
if(status==num)
return average;
else
return 0;
}
mid=average-mid/num-1;
status++;
// this.cycle++;
// System.out.println("...The cycle is "+this.cycle);
return this.assign(mid,num,status);
}
}
---------------------------------------------------------------------------------
package com;
/**
* @url http://community.csdn.net/Expert/topic/5537/5537552.xml?temp=9.827822E-02
* @author wunan320
*
*/
public class Test1 {
private static int num = 0;
private static int getRest(int count) {
if (count == 0) {
return 1;
}
if ( (num - 1) % 5 != 0) {
return -1;
}
num = (num - 1) * 4 / 5;
return getRest(count - 1);
}
public static void main(String[] args) {
int count = 5;
for (int sum = 0; true; sum++) {
num = sum;
int rest = getRest(count);
if (rest > 0) {
System.out.println(sum);
break;
}
}
}
}
}
}
比较两个递归的方式,感觉他的递归有点问题(count递减的时候).没时间想了.
书里对递归的说明:有时间了研究一下数据结构。
使用递归的好处是算法清晰,可读性比较好,但是频繁调用递归方法对程序的执行效率是非常不利的。因为一个方法在其中调用自己,系统就会在这个调用点上为其保留调用前该方法的现场(所谓现场就是指它当前执行到哪里以及与它相关的所有变量的值等),而递归方法往往是一个循环体中调用自己,而且循环体往往不确定,这就要求系统为其保存大量的现场信息,严重的还可能造成死机等恶劣问题。而且,事实上,学过数据结构的读者都知道,大多数递归算法都是可以转化为非递归算法的,所以,建议大家不要轻易使用递归。