猿问

在递归中使用和不使用'return'调用函数有什么区别?

我尝试创建用于生成 Pascal 三角形的递归函数,如下所示。


    numRows = 5

    ans=[[1],[1,1]]

          

    def pascal(arr,pre,idx):

        if idx==numRows:

            return ans

           

        if len(arr)!=idx:

            for i in range (0,len(pre)-1,1):

                arr+=[pre[i]+pre[i+1]]

        

        if len(arr)==idx:

            arr+=[1]

            ans.append(arr)

            pascal([1],arr,idx+1)

        

    a = pascal([1],ans[1],2)

    return a

我得到的输出是一个空列表[ ]。但是如果我return在调用时pascal添加


            return pascal([1],arr,idx+1)

输出是正确的[[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]。


据我了解,a应该由 分配return ans。那么为什么在没有a电话的情况下没有得到答案,为什么在这种情况下有必要呢?pascalreturnreturn


慕姐4208626
浏览 201回答 4
4回答

HUWWW

当你有递归时,你通常会以某种方式组合返回值。可以是总和,例如斐波那契数列:fibonacci(n+1) = fibonnaci(n)+fibonacci(n-1)或将一条线附加到矩阵,就像您的情况一样。反正没有回报就没有信息可以结合!考虑没有回报的斐波那契案例:def fibonnaci(n):&nbsp; if n<2:&nbsp; &nbsp; return 1&nbsp;&nbsp;&nbsp; fib_ans = fibonnaci(n-2)+fibonnaci(n-1)在这种情况下,如果我调用fibonnaci(0)或fibonnaci(1)输出将是 1,就像您在 idx == numRows 时返回 ans,但是如果我调用fibonnaci(2),则变量 fib_ans 将收到 2,这是预期的答案,但它可以在函数的范围。Python“将添加”return None到我函数的末尾,就在 fib_ans 属性的下方。所以,我需要返回 fib_ans

潇潇雨雨

当你这样做时pascal([1],arr,idx+1),你正在进行递归调用,但随后丢弃它返回的值。如果要将其返回给调用者,则需要显式使用return pascal(...).事实上,递归在这个例子中是没有必要的。您可以轻松地重构您的代码以使用一个简单的for循环。例如:def pascal(numRows):&nbsp; &nbsp; ans = [[1]]&nbsp; &nbsp; for _ in range(1, numRows):&nbsp; &nbsp; &nbsp; &nbsp; pre = ans[-1]&nbsp; &nbsp; &nbsp; &nbsp; arr = [1]&nbsp; &nbsp; &nbsp; &nbsp; for i in range(0,len(pre)-1,1):&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arr+=[pre[i]+pre[i+1]]&nbsp; &nbsp; &nbsp; &nbsp; arr+=[1]&nbsp; &nbsp; &nbsp; &nbsp; ans.append(arr)&nbsp; &nbsp; return ansprint(pascal(5))(根据惯例,我在这里使用名称_作为循环变量,因为它是一个不在循环内使用的虚拟变量,但您可以使用其他名称,例如,如果您愿意的话。)forrow上面的代码尽可能接近原始代码,但您还应该考虑使用arr.append(value)代替arr += [value]——这是将单个值附加到列表的正常方法。

千巷猫影

据我所知,如果你想获得价值,你需要“返回”声明......关键是如果你没有“回报”,你将得不到任何回报......希望这有助于..

函数式编程

对于所有具有关键字的算法语言,return它完全退出最近的函数,其结果是返回参数的表达式的结果。例如。def test(v):&nbsp; if v == 0:&nbsp; &nbsp; return someFun(10)&nbsp; ...如果v为零,则函数的结果是 返回的值someFun(10)。由 ... 表示的函数的其余部分永远不会执行,除非v是非零值。如果我们不写相同的return:def test(v):&nbsp; if v == 0:&nbsp; &nbsp; someFun(10)&nbsp; ...现在, when vis zerosomeFun(10)仍然被调用,但是它返回的值被丢弃,为了让它具有任何真正的意义,someFun需要做一些副作用,比如打印、存储值、更新对象。此外,所有由 ... 表示的功能的其余部分在someFun(10)完成后继续。return对于 Python 和许多其他语言来说,根本没有 a并不意味着它不返回任何东西。在 Python 中,return None每个函数/方法的最后一行都有一个不可见的。
随时随地看视频慕课网APP

相关分类

Python
我要回答