我在确定以下代码的重复关系时遇到问题:
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但我无法理解如何确定递归关系和复杂性。我应该考虑采取哪些措施来解决这类问题
答案 0 :(得分:0)
你可以简单地将其重写为迭代,这不应该改变复杂性。无论如何,考虑单个调用递归函数:
对print()
的第一个和最后一个字符有两次调用,或者在终止调用的情况下只有一个调用。其复杂性可能是不变的。此外,对递归调用的参数有substring()
调用。这个调用可能是线性的,但它也可以是常量,这取决于实现。
只有一个递归调用,这非常简单。
每个调用给后续字符少两个字符,因此递归调用的数量与输入长度呈线性关系。
对于整体复杂性,您只需将不同的步骤相互乘以以获得整体复杂性。在这种情况下,关于函数的作用非常糟糕。