黑马程序员技术交流社区
标题:
Java递归与反向思维的实例
[打印本页]
作者:
CodeUser1997
时间:
2018-8-2 22:29
标题:
Java递归与反向思维的实例
本帖最后由 CodeUser1997 于 2018-8-10 21:53 编辑
** 假设要把长度为 n 厘米的木棒切分为 1 厘米长的小段,但是 1 根木
棒只能由 1 人切分,当木棒被切分为 3 段后,可以同时由 3 个人分别切
分木棒。
求最多有 m 个人时,最少要切分几次?
例如:n = 8, m = 3 时如下所示,切分 4 次就可以了。
== == == == | == == == == 第一次
== == | == == == == | == == 第二次
== | == == | == == | == == == 第三次
== == == == == == == | == 第四次
== == == == == == == == 最终切完结果
*
@question
*/
public class
DivideClub {
public static void
main
(String[] args){
System.
out
.println(
getTimes
(
20
,
3
,
1
))
;
System.
out
.println(
getTimes02
(
20
,
3
))
;
}
/**
*
@thought
采用递归的思想
*
@param
length
木棒长度
*
@param
people
人的个数
*
@param
currents
木棒的个数
*
@return
切了多少次
*/
public static int
getTimes
(
int
length
,int
people
,int
currents){
if
(currents>=length){
return
0
;
}
else if
(currents<people){
return
1
+
getTimes
(length
,
people
,
currents*
2
)
;
}
else
{
return
1
+
getTimes
(length
,
people
,
currents+people)
;
}
}
/**
*
@though
反向思维,将1厘米的木棒组合成length长度即可,
* 即people个人只要组合的长度为length长度
*
@param
length
*
@param
people
*
@return
*/
public static int
getTimes02
(
int
length
,int
people){
int
counts=
0
;
int
currents=
1
;
//当前木棒长度
while
(currents<=length){
currents+=currents<people?currents:people
;
counts++
;
}
return
counts
;
}
}
作者:
CodeUser1997
时间:
2018-8-2 22:32
** 假设要把长度为 n 厘米的木棒切分为 1 厘米长的小段,但是 1 根木
棒只能由 1 人切分,当木棒被切分为 3 段后,可以同时由 3 个人分别切
分木棒。
求最多有 m 个人时,最少要切分几次?
例如:n = 8, m = 3 时如下所示,切分 4 次就可以了。
== == == == | == == == == 第一次
== == | == == == == | == == 第二次
== | == == | == == | == == == 第三次
== == == == == == == | == 第四次
== == == == == == == == 最终切完结果
*
@question
*/
public class
DivideClub {
public static void
main
(String[] args){
System.
out
.println(
getTimes
(
20
,
3
,
1
))
;
System.
out
.println(
getTimes02
(
20
,
3
))
;
}
/**
*
@thought
采用递归的思想
*
@param
length
木棒长度
*
@param
people
人的个数
*
@param
currents
木棒的个数
*
@return
切了多少次
*/
public static int
getTimes
(
int
length
,int
people
,int
currents){
if
(currents>=length){
return
0
;
}
else if
(currents<people){
return
1
+
getTimes
(length
,
people
,
currents*
2
)
;
}
else
{
return
1
+
getTimes
(length
,
people
,
currents+people)
;
}
}
/**
*
@though
反向思维,将厘米的木棒组合成length长度即可,
* 即people个人只要组合的长度为length长度
*
@param
length
*
@param
people
*
@return
*/
public static int
getTimes02
(
int
length
,int
people){
int
counts=
0
;
int
currents=
1
;
//当前木棒长度
while
(currents<=length){
currents+=currents<people?currents:people
;
counts++
;
}
return
counts
;
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2