【问题标题】:Unable to understand 'None' output of recursive calls无法理解递归调用的“无”输出
【发布时间】:2021-05-16 18:49:51
【问题描述】:

ideone有一个关于代码实现的不寻常请求:

n = 42
new= []
m = 0

def convert(n,m):
    print "round #:", m,"n :", n
    a = ((n+1) % 3)-1
    if n:
        new.append(a); print 'new :', new
        print 'call convert(' (n+1)//3,',',m+1,'):',convert((n+1)//3,m+1)
        print 'after convert(' , n, ',' ,m,  ')','\n'
    else:
        print 'n==',n, 'new: ::: ', new,'\n\n',
        return new, n

print  convert(n,m), "<<---- None returned ? "

我不知道为什么下面的输出中会打印“无”。输出 'None' 打印在两个地方(案例):

案例#1。 print '转换后(' , n, ',' ,m, ')','\n'

案例#2。 print convert(n,m), "

我完全不清楚为什么如果“n = 0”的默认情况具有列表“新”的正确值,那么在情况#2 中如何返回“无”。

据我说,'new' 内容应该打印在 case #2 中。


更令人困惑的是:为什么 case #1 对于 'n' 的非零值每次都返回 'None'?

根据我的说法,案例 #1 不应该打印“无”。

【问题讨论】:

标签: python recursion return


【解决方案1】:

如果你想避免 None 成为你的输出,我们必须确保你的函数返回一个值。

在您的情况下,else 语句中有一个 return 语句,但 if 语句中没有。

您可以为if 部分引入一个返回语句,或者更改函数返回语句的缩进。

n = 42
new= []
m = 0

def convert(n,m):
    print "round #:", m,"n :", n
    a = ((n+1) % 3)-1
    if n:
        new.append(a); print 'new :', new
        print 'call convert(' +  str((n+1)//3,) + ',',m+1,'):',convert((n+1)//3,m+1)
        print 'after convert(' , n, ',' ,m,  ')','\n'
    else:
        print 'n==',n, 'new: ::: ', new,'\n\n',
    return new, n

print  convert(n,m)

【讨论】:

  • 我认为您是在说明案例 #2,即打印列表“新”的内容。但是在案例 #1 中未要求的“无”令人困惑。
  • 每次调用 convert 而没有返回,你会得到一个 None。
  • 顺便说一句,我们鼓励您改用 Python 3。
  • 我擅长理解和编码基本的python代码。但是,通过一个 mse 帖子(评论来自:djangofan 到 math.stackexchange.com/q/695979/424260)在 java 中的代码:repl.it/@djangofan/RecusiveTaskFibonaccijava。请求知道其中是否需要分叉。如果是,为什么正常(顺序)代码不起作用。
  • 你想做什么?作者似乎想要一个递归实现。
猜你喜欢
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 2014-09-17
  • 2016-12-07
相关资源
最近更新 更多