davidmou 发表于 2023-10-6 01:02:47

递归问题

from pythonds.basic import Stack
ub = Stack()
def jinzhizhuanhua(num, fundamention):
    dic = "0123456789ABCDEF"
    if num < fundamention:
      ub.push(dic)
      return ub
    else:
      ub.push(dic)
      return jinzhizhuanhua(int(num//fundamention),fundamention)


ub = jinzhizhuanhua(10, 2)
for i in range(ub.size()):
    print(ub.peek(), end="")


return jinzhizhuanhua(int(num//fundamention),fundamention)这一行代码变为 jinzhizhuanhua(int(num//fundamention),fundamention),的效果有何不同,两者都可以递归吗

isdkz 发表于 2023-10-6 01:02:58

将代码中的return ub改为return jinzhizhuanhua(num//fundamention, fundamention)的效果是将递归的过程放在了返回值中,即每次递归得到的结果都会作为返回值被传递到上一层递归中。而原来的代码中是先将每次递归得到的结果压入栈中,最后再一次性将栈中的元素依次弹出并打印,这种方式也可以实现递归的效果,但是需要额外的空间来存储栈。两种方式都可以实现递归,但是在具体实现中要根据实际情况选择合适的方式。

两种方式都是递归,但是return jinzhizhuanhua(num//fundamention, fundamention)的方式更符合递归的本质,即每次递归都是将原问题转化为一个规模更小的同类问题,直到问题规模足够小可以直接求解。

Mike_python小 发表于 2023-10-6 01:03:25

在这段代码中,将 return jinzhizhuanhua(int(num//fundamention),fundamention) 改为 jinzhizhuanhua(int(num//fundamention),fundamention) 会导致不同的结果。

1. return jinzhizhuanhua(int(num//fundamention),fundamention):这行代码使用了递归调用,并将递归调用的结果作为返回值返回给调用者。因此,整个递归过程会一直执行下去,直到满足终止条件并返回最终结果。

2. jinzhizhuanhua(int(num//fundamention),fundamention):这行代码也使用了递归调用,但没有将递归调用的结果作为返回值返回给调用者。相当于只是执行了递归操作,但没有将结果传递出来。在原始代码中,这行代码的作用是更新栈 ub 的内容,但没有返回修改后的栈。

因此,如果将 return jinzhizhuanhua(int(num//fundamention),fundamention) 修改为 jinzhizhuanhua(int(num//fundamention),fundamention),则无法从函数外部获取递归结果,仅仅进行递归操作而已。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

jitux 发表于 2023-10-6 18:31:41

带有 return 关键字的行:return jinzhizhuanhua(int(num//fundamention),fundamention)

不带 return 关键字的行:jinzhizhuanhua(int(num//fundamention),fundamention)

在第一种情况下(带有 return 关键字),函数 jinzhizhuanhua 被递归调用,并且它的返回值被返回给上一层的调用者。这意味着递归调用的结果可以用于其他操作或存储在变量中。

在第二种情况下(不带 return 关键字),函数 jinzhizhuanhua 被递归调用,但没有返回值。这意味着递归调用的结果在这个上下文中不会被使用,也不会影响函数的结果。

在你的具体情况下,如果你想要获得递归调用的结果并将其返回给调用者,你应该使用第一种情况,即带有 return 关键字的行。这样,递归调用的结果将传递到上一层的调用者,直到最终结果被返回给主程序。

如果你只是想在函数内部执行递归调用而不关心结果,你可以使用第二种情况,不带 return 关键字的行。但需要注意,在这种情况下,递归调用的结果将不会被使用或返回到主程序。
页: [1]
查看完整版本: 递归问题