确定递归函数的复杂性

时间:2015-11-29 18:36:09

标签: asymptotic-complexity recurrence

我在确定以下代码的重复关系时遇到问题:

 public static void Method1(String S){ 
  if(S.length()>1){      
  System.out.print(S.charAt(S.length()-1));  
  Method1(S.substring(1,S.length()-1));
  System.out.print(S.charAt(0)); 
  } 
  if(S.length()==1) 
  System.out.print(S.charAt(0));
 }

我知道这段代码会反转给定的字符串,终止条件是string.length()= 0但我无法理解如何确定递归关系和复杂性。我应该考虑采取哪些措施来解决这类问题

1 个答案:

答案 0 :(得分:0)

你可以简单地将其重写为迭代,这不应该改变复杂性。无论如何,考虑单个调用递归函数:

除了递归调用之外,它的复杂性是什么?

print()的第一个和最后一个字符有两次调用,或者在终止调用的情况下只有一个调用。其复杂性可能是不变的。此外,对递归调用的参数有substring()调用。这个调用可能是线性的,但它也可以是常量,这取决于实现。

然后,每次呼叫有多少递归呼叫?

只有一个递归调用,这非常简单。

此外,这会有多深?

每个调用给后续字符少两个字符,因此递归调用的数量与输入长度呈线性关系。

摘要

对于整体复杂性,您只需将不同的步骤相互乘以以获得整体复杂性。在这种情况下,关于函数的作用非常糟糕。