【发布时间】:2011-12-15 06:21:51
【问题描述】:
我正在阅读的一本 Java 书籍中的一个练习让我感到困惑:
斐波那契数列是数字 1、1、2、3、5、8、 13、21、34 等,其中每个数字(从第三个开始)都是总和 前两个中的。创建一个将整数作为参数的方法 参数并显示从 开始。例如,如果您运行 java Fibonacci 5(其中 Fibonacci 是 类的名称)输出将是:1、1、2、3、5。
我本可以发誓它需要一个数组或某种方式来存储以前的数字,但是当我看到答案时,情况并非如此:
import java.util.*;
public class Fibonacci {
static int fib(int n) {
if (n <= 2)
return 1;
return fib(n-1) + fib(n-2);
}
public static void main(String[] args) {
// Get the max value from the command line:
int n = Integer.parseInt(args[0]);
if(n < 0) {
System.out.println("Cannot use negative numbers"); return;
}
for(int i = 1; i <= n; i++)
System.out.print(fib(i) + ", ");
}
}
有人能解释在其内部使用函数是如何产生这种情况的吗?
【问题讨论】:
-
在自身内部使用函数称为
recursion -
了解递归的最好方法是学习递归。
-
学习递归的最好方法就是去做,不要想花哨的名字。想象一下你是编译器/虚拟机,你正在运行程序。感受堆栈的存在。达到禅意。
-
我真的建议以
n(可能是 4 或 5)的低值“玩电脑”。跟踪准确代码运行时发生的情况。努力得到了回报。 -
这是一个递归解决方案。这也是一个糟糕的解决方案,除非您想要最小化效率。请注意,它不断地重新计算以前的 fib 数字。线性解决方案更好。