为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕姐4208626 2023-06-06 16:10:45
我尝试创建用于生成 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
查看完整描述

4 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

当你有递归时,你通常会以某种方式组合返回值。可以是总和,例如斐波那契数列:


fibonacci(n+1) = fibonnaci(n)+fibonacci(n-1)

或将一条线附加到矩阵,就像您的情况一样。反正没有回报就没有信息可以结合!考虑没有回报的斐波那契案例:


def fibonnaci(n):

  if n<2:

    return 1

  

  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


查看完整回答
反对 回复 2023-06-06
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

当你这样做时pascal([1],arr,idx+1),你正在进行递归调用,但随后丢弃它返回的值。如果要将其返回给调用者,则需要显式使用return pascal(...).


事实上,递归在这个例子中是没有必要的。您可以轻松地重构您的代码以使用一个简单的for循环。例如:


def pascal(numRows):

    ans = [[1]]

    for _ in range(1, numRows):

        pre = ans[-1]

        arr = [1]

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

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

        arr+=[1]

        ans.append(arr)

    return ans


print(pascal(5))

(根据惯例,我在这里使用名称_作为循环变量,因为它是一个不在循环内使用的虚拟变量,但您可以使用其他名称,例如,如果您愿意的话。)forrow


上面的代码尽可能接近原始代码,但您还应该考虑使用arr.append(value)代替arr += [value]——这是将单个值附加到列表的正常方法。


查看完整回答
反对 回复 2023-06-06
?
千巷猫影

TA贡献1829条经验 获得超7个赞

据我所知,如果你想获得价值,你需要“返回”声明......

关键是如果你没有“回报”,你将得不到任何回报......

希望这有助于..


查看完整回答
反对 回复 2023-06-06
?
函数式编程

TA贡献1807条经验 获得超9个赞

对于所有具有关键字的算法语言,return它完全退出最近的函数,其结果是返回参数的表达式的结果。例如。


def test(v):

  if v == 0:

    return someFun(10)

  ...

如果v为零,则函数的结果是 返回的值someFun(10)。由 ... 表示的函数的其余部分永远不会执行,除非v是非零值。


如果我们不写相同的return:


def test(v):

  if v == 0:

    someFun(10)

  ...

现在, when vis zerosomeFun(10)仍然被调用,但是它返回的值被丢弃,为了让它具有任何真正的意义,someFun需要做一些副作用,比如打印、存储值、更新对象。此外,所有由 ... 表示的功能的其余部分在someFun(10)完成后继续。


return对于 Python 和许多其他语言来说,根本没有 a并不意味着它不返回任何东西。在 Python 中,return None每个函数/方法的最后一行都有一个不可见的。


查看完整回答
反对 回复 2023-06-06
  • 4 回答
  • 0 关注
  • 199 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信