回溯和递归澄清

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

【讨论】:

以上是关于回溯和递归澄清的主要内容,如果未能解决你的问题,请参考以下文章

递归与回溯4:一文彻底理解回溯

递归和回溯求解8皇后问题

递归和回溯求解8皇后问题

2023-04-19 算法面试中常见的递归和回溯问题

递归与回溯:python列表组合问题

回溯法八皇后问题(递归和非递归)