鱼C论坛

 找回密码
 立即注册
查看: 2092|回复: 3

[已解决]递归问题

[复制链接]
发表于 2023-10-6 01:02:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
from pythonds.basic import Stack
ub = Stack()
def jinzhizhuanhua(num, fundamention):
    dic = "0123456789ABCDEF"
    if num < fundamention:
        ub.push(dic[num])
        return ub
    else:
        ub.push(dic[num % fundamention])
        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),的效果有何不同,两者都可以递归吗
最佳答案
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 关键字的行。但需要注意,在这种情况下,递归调用的结果将不会被使用或返回到主程序。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

两种方式都是递归,但是  return jinzhizhuanhua(num//fundamention, fundamention)  的方式更符合递归的本质,即每次递归都是将原问题转化为一个规模更小的同类问题,直到问题规模足够小可以直接求解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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),则无法从函数外部获取递归结果,仅仅进行递归操作而已。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 关键字的行。但需要注意,在这种情况下,递归调用的结果将不会被使用或返回到主程序。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 14:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表