回溯和递归澄清
Posted
技术标签:
【中文标题】回溯和递归澄清【英文标题】:Backtracking and Recursion Clarification 【发布时间】:2019-05-04 16:58:58 【问题描述】:有人能指出代码 sn-ps 的区别、好处和复杂性吗?它们都是回溯还是第一个是递归,第二个是回溯?
来源: https://www.geeksforgeeks.org/print-all-permutations-of-a-string-in-java/ https://www.geeksforgeeks.org/java-program-to-print-all-permutations-of-a-given-string/
Code 1
========
public class GFG
static void printPermutn(String str, String ans)
if (str.length() == 0)
System.out.print(ans + " ");
return;
for (int i = 0; i < str.length(); i++)
char ch = str.charAt(i);
String ros = str.substring(0, i) +
str.substring(i + 1);
printPermutn(ros, ans + ch);
public static void main(String[] args)
String s = "abb";
printPermutn(s, "");
Code 2
========
public class Permutation
public static void main(String[] args)
String str = "ABC";
int n = str.length();
Permutation permutation = new Permutation();
permutation.permute(str, 0, n - 1);
private void permute(String str, int l, int r)
if (l == r)
System.out.println(str);
else
for (int i = l; i <= r; i++)
str = swap(str, l, i);
permute(str, l + 1, r);
str = swap(str, l, i);
public String swap(String a, int i, int j)
char temp;
char[] charArray = a.toCharArray();
temp = charArray[i];
charArray[i] = charArray[j];
charArray[j] = temp;
return String.valueOf(charArray);
【问题讨论】:
【参考方案1】:两个代码 sn-ps 都实现了某种形式的递归。您可以看出这一点,因为两者都有带有基本案例的代码和一个调用自身的函数。你可以看到更多documentation on recursion here。递归的最基本形式是调用自身直到满足条件的函数。
计算阶乘的递归示例在这里:
int fact(int n)
if (n < = 1) // base case
return 1;
else
return n*fact(n-1);
这里,如果 n = 1,则返回 1。否则,返回您输入的数字 * 数字 - 1 阶乘。
所以如果你输入10
return 10 * factorial (9) = 10 * 9 * factorial (8) = 10 * 9 * 8 * factorial (7)
等等,直到你得到 p>
10 * 9 * 7 * 6 * 5 * 4 * 3 * 2 * factorial (0) = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1
另外,两者都实现了回溯,since backtracking is simply finding some set (sometimes a subset, sometimes all) solutions to a problem
【讨论】:
以上是关于回溯和递归澄清的主要内容,如果未能解决你的问题,请参考以下文章