ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

递归函数return 深入理解

2022-02-24 06:00:07  阅读:205  来源: 互联网

标签:right return backtrack 递归函数 pop 深入 append left


先贴一段最简单的递归函数的代码:

static int Sum(int n)
        {
            if (n <= 1)                  //#1
                return n;                //#2
            return n+Sum(n - 1);         //#3
        }

sum函数为递归求和函数,sum(3)->sum(2)->sum(1),此时return 1, 但return 1 并不是直接return到最外层,而是逐个返回到上一层的递归函数,直到第一次函数调用,return n+sum(1)->return n+sum(2).

同理,对该题
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        ans = []
        def backtrack(S = [], left = 0, right = 0):
            if len(S) == 2 * n:
                ans.append("".join(S))
            if left < n:
                S.append("(")
                backtrack(S, left+1, right)
                S.pop()
            if right < left:
                S.append(")")
                backtrack(S, left, right+1)
                S.pop()


        backtrack()
        return ans

generateParenthesis(2),函数从backtrack()开始执行, S=[], left=0,right=0-> S.append("(") backtrack(''(', 1, 0)  -> S.append("((") backtrack(''((', 2, 0) -> S.append(")") backtrack(''(()'', 2, 1) -> S.append(")") backtrack(''(())'', 2, 2)->ans.append("".join(S))

 

此时函数返回None, 并不会直接返回到递归函数最外层,而是逐个递归到上一层所执行的函数,直到第一次执行S=[], left=0,right=0

backtrack(''(())'', 2, 1)  S.pop() -> backtrack(''(()'', 2, 0)  S.pop() -> backtrack(''(('', 1, 0)  S.pop() -> S.append(")") backtrack(''()'', 1, 1)  ->S.append("(") backtrack(''()('', 2, 1)->S.append(")") backtrack(''()()'', 2, 2) -> ans.append("".join(S))

->返回到right<left S.pop()-> S.pop()->S.pop()->S.pop() 此时S=[], left=0,right=0  return ans

 

参考链接:

https://blog.csdn.net/weixin_40476348/article/details/98602498

https://its401.com/article/weixin_43812682/103418186

 

标签:right,return,backtrack,递归函数,pop,深入,append,left
来源: https://www.cnblogs.com/luoluoHome/p/15929987.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有