因此,我自己学习动态编程,并且尝试测试记忆化的解决方案与正常的斐波那契解决方案。 当我输入一个相当大的数字(如43)时,我的记忆解决方案将永远运行,而普通解决方案将在5-6秒后运行。这是否意味着我记住的解决方案不被记住?
这是我的传统解决方案:
public static int fibonacci(int i)
{
if(i == 0)
{
return 0;
}
if(i <= 2)
{
return 1;
}
return fibonacci(i - 1) + fibonacci(i - 2);
}
已解决的解决方案:
public static int fibonacci(int n)
{
Map<Integer, Integer> memo = new HashMap<>();
if(n == 0)
{
return 0;
}
if(n <= 2)
{
return 1;
}
if(memo.containsKey(n))
{
return memo.get(n);
}
int result = fibonacci(n - 1) + fibonacci(n - 2);
memo.put(n, result);
return result;
}
主要方法:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
scanner.close();
System.out.println(fibonacci(n));
}
对于这种情况的任何解释,将不胜感激:)
答案 0 :(得分:3)
由于@shmosel,我能够弄清楚在“ memoized”解决方案中,每次调用该方法时,都会调用一个新地图,这将导致它非常慢!我通过将地图添加为实例变量来规避此问题,如下所示:
{{1}}
这大大提高了性能。