笔试出现 裴波那契数列

游一游走一走 2010-01-02 12:36:11
最近有空在重温think in java第四版,课后习题出现了裴波那契数列,回想起一年前的一次笔试经历,要求给定打印个数打印裴波那契数列,那个时候我极其厌恶递归,感觉它不那么直观,我于是采用了类似的写法:
private static List<BigInteger> rs = new ArrayList();
static {
rs.add(BigInteger.valueOf(1L));
rs.add(BigInteger.valueOf(1L));
}

public static void bofeiteOther(int n) {
if (n <= 2) {
System.out.println("输入参数大于2");
} else {
while (true) {
if (rs.size() == n) {
break;
} else {
rs.add(rs.get(rs.size() - 1).add(rs.get(rs.size() - 2)));
}

}
}
}
由于是刚出道面试,考虑的不周全,List存的是int型,但现在发现一个裴波那契数列可以轻易的超过32位的int,而且64位的long也很容易容纳不下....
今天测试的过程中我使用递归试了下,代码如下:
public static BigInteger bofeite(int n) {
BigInteger rs = null;
if (n == 1) {
rs = BigInteger.valueOf(1L);
} else if (n == 2) {
rs = BigInteger.valueOf(1L);
} else {
rs = bofeite(n - 1).add(bofeite(n - 2));
}
return rs;

}
当输出第40个值时花了大量的时间....
102334155
递归花费时间为19360
102334155
非递归花费时间为0
********************请问各位大虾******************
1.是我递归写的有问题,还是本来就慢?(好像每个值都得重新计算一次,无保存上次计算结果)
2.笔试时出现这样的题目的是为了考验笔试者什么知识?
3.如果因为我写出如上非递归的算法,面试官是鄙视的态度我应该如何评价他?
...全文
212 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dazzlingwinter 2010-01-04
  • 打赏
  • 举报
回复

public class FiberNaQiArray {
private static int N = 1000;
public static void main(String[] args) {
long[] a = new long[N];
long start, end;
a[0] = 1;
a[1] = 1;
start = System.currentTimeMillis();
System.out.println(start);
for(int i=2; i<N; i++) {
a[i] = a[i-1] + a[i-2];
}
end = System.currentTimeMillis();
System.out.println(end);
System.out.println("a[" + N + "] = " +a[N-1] + "\tcost:\t" + (end -start) + "ms");
}
}

用数组来保存结算结果,速度很快的;
递归嘛,不断的来调用,当N很大时栈的规模估计会很大,耗时较多了!
Result:
1262580792006
1262580792006
a[1000] = 817770325994397771 cost: 0ms
临碣 2010-01-04
  • 打赏
  • 举报
回复
没看到原题,是求裴波那契数列第n项值么?

无聊的题啊,楼主.

裴波那契数列有求和公式的.这个事情,一般数学书上不说的.
ChDw 2010-01-04
  • 打赏
  • 举报
回复
如果只是求其中第N个元素,根本无需保存这么多元素啊,这个会浪费很多时间的。只需要记录之前两个元素就可以啦。
Dazzlingwinter 2010-01-04
  • 打赏
  • 举报
回复
3L的运行结果:
1262581243350
1262581244881
a[40] = 165580141 cost: 1531ms
Dazzlingwinter 2010-01-04
  • 打赏
  • 举报
回复

public class FiberNaQiArray {
private static int N = 40;
public static void main(String[] args) {
// long[] a = new long[N];
long start, end;
// a[0] = 1;
// a[1] = 1;
start = System.currentTimeMillis();
System.out.println(start);
// for(int i=2; i<N; i++) {
// a[i] = a[i-1] + a[i-2];
// }
long result = fibernaqi(N);
end = System.currentTimeMillis();
System.out.println(end);
// System.out.println("a[" + N + "] = " +a[N-1] + "\tcost:\t" + (end -start) + "ms");
System.out.println("a[" + N + "] = " +result + "\tcost:\t" + (end -start) + "ms");
}

public static long fibernaqi(int n) {
if(0 == n || 1 == n) {
return 1;
}
else {
return fibernaqi(n-1) + fibernaqi(n-2);
}
}
}

哎,估计就是考算法的思想了,白板测试,不准调试,谁也不能说一定没有疏漏啊
游一游走一走 2010-01-03
  • 打赏
  • 举报
回复
顶起.....光看无回答的....难道这问题很幼稚么?

51,397

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧