鱼C论坛

 找回密码
 立即注册
查看: 1365|回复: 15

[已解决]请教 Python 递归问题

[复制链接]
发表于 2018-2-18 22:52:34 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 屁哥 于 2018-2-18 23:50 编辑

def Dec2Bin(dec):
    result = ""

    if dec:
        print("\\\dec11",dec)
        result = Dec2Bin(dec // 2)
        print("--result",result)
        print("++dec22",dec)
        
        temp = result + str(dec % 2)
        print("===temp",temp)
        
        return result + str(dec%2)
    else:
        return result
   
print(Dec2Bin(10))

\\dec11 10
\\dec11 5
\\dec11 2
\\dec11 1


--result   
++dec22   1
===temp   1

--result   1
++dec22   2
===temp   10

--result   10
++dec22   5
===temp   101

--result   101
++dec22   10
===temp   1010

1010

我自己琢磨着 打印了一下过程 但是越来越迷糊了
1,按我打印出来的过程 是这样的 retult = Dec2Bin(dec//2) 执行了4次  地板除 直到 为 1 的时候才开始循环 为什么?
2,下面开始循环 为啥 第一次 rasult  是空的 没有值 为什么 result 不是 1

  1. def Dec2Bin(dec):
  2.     result = ""

  3.     if dec:
  4.         print("\\\dec11",dec)
  5.         result = Dec2Bin(dec // 2)
  6.         print("--result",result)
  7.         print("++dec22",dec)
  8.         
  9.         temp = result + str(dec % 2)
  10.         print("===temp",temp)
  11.         
  12.         return result + str(dec%2)
  13.     else:
  14.         return result
  15.    
  16. print(Dec2Bin(10))
复制代码
最佳答案
2018-2-18 22:52:35
屁哥 发表于 2018-2-18 23:57
你的函数进去第一行就是 result="",空字符也是值啊,没赋值你的函数早报错了。
参数为 1 时result接受 ...

会继续地板除啊,然后参数为 0 啊,就执行这样的函数啊

  1. def Dec2Bin(dec=0):
  2.     result = ""

  3.     if dec:
  4.         print("\\\dec11",dec)
  5.         result = Dec2Bin(dec//2)
  6.         print("--result",result)
  7.         print("++dec22",dec)
  8.         
  9.         temp = result + str(dec % 2)
  10.         print("===temp",temp)
  11.         
  12.         return result + str(dec%2)
  13.    else:
  14.         return result          #参数为0时,执行的是这部分,然后有个返回值是result,也就是空,然后给上一个函数
复制代码


这个函数里第一行不是 result = "" ? 然后这个空字符返回给参数为1 的函数里result = Dec2Bin(1//2) 这一句的result,然后参数为 1 的函数里的这一句下面的语句才会开始执行懂吗?
345.png

最佳答案

查看完整内容

会继续地板除啊,然后参数为 0 啊,就执行这样的函数啊 这个函数里第一行不是 result = "" ? 然后这个空字符返回给参数为1 的函数里result = Dec2Bin(1//2) 这一句的result,然后参数为 1 的函数里的这一句下面的语句才会开始执行懂吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-18 22:52:35 | 显示全部楼层    本楼为最佳答案   
屁哥 发表于 2018-2-18 23:57
你的函数进去第一行就是 result="",空字符也是值啊,没赋值你的函数早报错了。
参数为 1 时result接受 ...

会继续地板除啊,然后参数为 0 啊,就执行这样的函数啊

  1. def Dec2Bin(dec=0):
  2.     result = ""

  3.     if dec:
  4.         print("\\\dec11",dec)
  5.         result = Dec2Bin(dec//2)
  6.         print("--result",result)
  7.         print("++dec22",dec)
  8.         
  9.         temp = result + str(dec % 2)
  10.         print("===temp",temp)
  11.         
  12.         return result + str(dec%2)
  13.    else:
  14.         return result          #参数为0时,执行的是这部分,然后有个返回值是result,也就是空,然后给上一个函数
复制代码


这个函数里第一行不是 result = "" ? 然后这个空字符返回给参数为1 的函数里result = Dec2Bin(1//2) 这一句的result,然后参数为 1 的函数里的这一句下面的语句才会开始执行懂吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-18 23:02:15 | 显示全部楼层
难受
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-18 23:10:44 | 显示全部楼层
本帖最后由 °蓝鲤歌蓝 于 2018-2-18 23:11 编辑

1 从哪里来?
参数为10执行到
  1. result = Dec2Bin(dec // 2)
复制代码
就会开始执行里面参数为5时的函数
参数为5执行到同上那一句又会递归到参数为2的函数里,依次到参数为0时的函数才会返回确切的值
  1. result=""
复制代码
所以它返回的是空
这个空被返回后 前面函数的
  1. result = Dec2Bin(dec // 2)
复制代码
下面的语句,并依次返回到上一层(我以层数表示)函数,最后到参数为10这一层。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-18 23:26:37 | 显示全部楼层
本帖最后由 °蓝鲤歌蓝 于 2018-2-18 23:30 编辑
  1. def Dec2Bin(dec):
  2.     result = ""

  3.     if dec:
  4.         print("\\\dec11",dec)
  5.         result = Dec2Bin(dec // 2)      # 执行到这一句时,会执行Dec2Bin(dec // 2)代码,下面的代码不会被执行
  6.         print("--result",result)
  7.         print("++dec22",dec)
  8.         
  9.         temp = result + str(dec % 2)
  10.         print("===temp",temp)
  11.         
  12.         return result + str(dec%2)
  13.     else:
  14.         return result
  15.    
  16. print(Dec2Bin(10))
复制代码


参数为10

  1. def Dec2Bin(dec=10):
  2.     result = ""

  3.     if dec:
  4.         print("\\\dec11",dec)
  5.         result = Dec2Bin(5)        # 执行到这一句时,会执行Dec2Bin(5)代码,下面的代码不会被执行(下面的函数同理,我就不写了)
  6.         print("--result",result)
  7.         print("++dec22",dec)
  8.         
  9.         temp = result + str(dec % 2)
  10.         print("===temp",temp)
  11.         
  12.         return result + str(dec%2)
  13.     else:
  14.         return result
复制代码



参数为5

  1. def Dec2Bin(dec=5):
  2.     result = ""

  3.     if dec:
  4.         print("\\\dec11",dec)
  5.         result = Dec2Bin(2)     # 执行到这一句时,下面的代码不会被执行
  6.         print("--result",result)
  7.         print("++dec22",dec)
  8.         
  9.         temp = result + str(dec % 2)
  10.         print("===temp",temp)
  11.         
  12.         return result + str(dec%2)
  13.     else:
  14.         return result
复制代码


参数为2

  1. def Dec2Bin(dec=2):
  2.     result = ""

  3.     if dec:
  4.         print("\\\dec11",dec)
  5.         result = Dec2Bin(1)     # 执行到这一句时,下面的代码不会被执行
  6.         print("--result",result)
  7.         print("++dec22",dec)
  8.         
  9.         temp = result + str(dec % 2)
  10.         print("===temp",temp)
  11.         
  12.         return result + str(dec%2)
  13.     else:
  14.         return result
复制代码


参数为1

  1. def Dec2Bin(dec=1):
  2.     result = ""

  3.     if dec:
  4.         print("\\\dec11",dec)
  5.         result =Dec2Bin(0)                                      # 执行到这一句时,下面的代码不会被执行
  6.         [color=Yellow]print("--result",result)[/color]         # 这一句时接受下面那个函数的返回值后首先被打印出来的,也就是你看到的第一个'--result',所以是""
  7.         print("++dec22",dec)                                          #你看到的第一句"++dec22"
  8.         
  9.         temp = result + str(dec % 2)
  10.         print("===temp",temp)                                         # 你看到的第一个"temp"
  11.         
  12.         return result + str(dec%2)
  13.     else:
  14.         return result                                                        #这个result 是返回给上面那个函数的,为 "1"。 (上面的函数就这样子推上去,我就不说了)
复制代码


参数为0

  1. def Dec2Bin(dec=0):
  2.     result = ""

  3.     if dec:
  4.         print("\\\dec11",dec)
  5.         result = Dec2Bin(dec//2)
  6.         print("--result",result)
  7.         print("++dec22",dec)
  8.         
  9.         temp = result + str(dec % 2)
  10.         print("===temp",temp)
  11.         
  12.         return result + str(dec%2)
  13.    else:
  14.         return result          #参数为0时,执行的是这部分,然后有个返回值是result,也就是空,然后给上一个函数
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-2-18 23:30:41 | 显示全部楼层
°蓝鲤歌蓝 发表于 2018-2-18 23:10
1 从哪里来?
参数为10执行到就会开始执行里面参数为5时的函数
参数为5执行到同上那一句又会递归到参数为 ...

1 从哪里来?
参数为10执行到
result = Dec2Bin(dec // 2)
复制代码
就会开始执行里面参数为5时的函数
参数为5执行到同上那一句又会递归到参数为2的函数里,依次到参数为0时的函数才会返回确切的值

这个 好像理解了  result = Dec2Bin(dec // 2)   因为这里调用到了函数自身 所以就 重新开始 又调用函数 是这样么?直到函数成 0 了  才开始执行下面的语句?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-18 23:32:30 | 显示全部楼层
屁哥 发表于 2018-2-18 23:30
1 从哪里来?
参数为10执行到
result = Dec2Bin(dec // 2)

对你这个函数来说是这样的,因为你这里是参数为0时有个确定的返回值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-2-18 23:49:45 | 显示全部楼层
°蓝鲤歌蓝 发表于 2018-2-18 23:32
对你这个函数来说是这样的,因为你这里是参数为0时有个确定的返回值。

地板除 这块整明白了 函数参数  != 0 就i一直执行这个函数做地板除  当函数参数为 0 的时候
if dec == 0:  执行  else: return result   那 result 并没有被赋值啊
参数为1  那段 往下没整明白 拜托再讲讲
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-18 23:54:13 | 显示全部楼层
屁哥 发表于 2018-2-18 23:49
地板除 这块整明白了 函数参数  != 0 就i一直执行这个函数做地板除  当函数参数为 0 的时候
if dec == 0 ...

我都写得这么细了
你的函数进去第一行就是 result="",空字符也是值啊,没赋值你的函数早报错了。
参数为 1 时result接受的是你参数为 0 时的返回值,也就是那个空字符,然后就会往下执行了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-2-18 23:57:10 | 显示全部楼层
°蓝鲤歌蓝 发表于 2018-2-18 23:54
我都写得这么细了
你的函数进去第一行就是 result="",空字符也是值啊,没赋值你的函数早报错了。
参数 ...

你的函数进去第一行就是 result="",空字符也是值啊,没赋值你的函数早报错了。
参数为 1 时result接受的是你参数为 0 时的返回值,也就是那个空字符,然后就会往下执行了


参数为1 的时候 不会继续地板除了么?  函数参数 dec  又变成 0,  然后去执行 else 里边的内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-2-19 00:10:59 | 显示全部楼层
°蓝鲤歌蓝 发表于 2018-2-18 23:54
我都写得这么细了
你的函数进去第一行就是 result="",空字符也是值啊,没赋值你的函数早报错了。
参数 ...

发生了什么  最后一条回复呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-19 00:11:43 | 显示全部楼层
屁哥 发表于 2018-2-19 00:10
发生了什么  最后一条回复呢

我找半天才找到,跑前面去了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-2-19 00:21:38 | 显示全部楼层
°蓝鲤歌蓝 发表于 2018-2-18 22:52
会继续地板除啊,然后参数为 0 啊,就执行这样的函数啊

这个函数里第一行不是 result = "" ? 然后这个 ...

123.png

再领悟领悟
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-19 00:27:14 | 显示全部楼层

我休息了,加油老哥。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-2-19 00:27:56 | 显示全部楼层
°蓝鲤歌蓝 发表于 2018-2-19 00:11
我找半天才找到,跑前面去了。

嗯 置顶了  哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-2-19 13:52:04 | 显示全部楼层
°蓝鲤歌蓝 发表于 2018-2-18 22:52
会继续地板除啊,然后参数为 0 啊,就执行这样的函数啊

这个函数里第一行不是 result = "" ? 然后这个 ...

下午好
我又来折磨自己了
有空帮我看看我的新贴
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 03:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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