redaiconglin 发表于 2021-2-11 15:18:13

各位老师这段代码报错格式化字符串没有足够的参数如何解决

def dec28in(dec):
    result = ''
    if dec:
      result = dec28in(dec//2)
      print('%s = dec28in(%s//2)'%(result,dec))
      print('%s + str((%d)%2)'%(result,dec))      问题出在这段代码需要怎么改
      
      
      return result + str(dec%2)
      
    else:
      return result

print(dec28in(62))
另外这段代码如果正常输出result为什么是1.按照顺序应该是62%2第一个输出的应该是0才对啊。一直没有搞明白。谢谢老师能解决一下我的疑惑。感谢了
= dec28in(1//2)
1 = dec28in(3//2)
11 = dec28in(7//2)
111 = dec28in(15//2)
1111 = dec28in(31//2)
11111 = dec28in(62//2)
111110

洋洋痒 发表于 2021-2-11 16:15:28

第一个输出的为什么是0 呢

逃兵 发表于 2021-2-11 17:40:11

少打个百分号
def dec28in(dec):
    result = ''
    if dec:
      result = dec28in(dec//2)
      print('%s = dec28in(%s//2)'%(result,dec))
      print('%s + str((%d)%%2)'%(result,dec))      
      return result + str(dec%2)
      
    else:
      return result

print(dec28in(62))

解析

print(Dec2Bin(62)) # 这一句,意味着打印函数,变量值为62

第一轮:
   if dec:
      result = Dec2Bin(dec//2)   # 这个位置result的值是,62//2,即:31
      return result + str(dec%2)   # 这个位置 result 为 空置 + 62%2,即:0

第二轮:
if dec:
      result = Dec2Bin(dec//2)   # 这个位置result的值是,31//2,即:15
      return result + str(dec%2)   # 这个位置 result 为 0 + 31%2,即:10

第三轮:
if dec:
      result = Dec2Bin(dec//2)   # 这个位置result的值是,15//2,即:7
      return result + str(dec%2)   # 这个位置 result 为 10 + 15%2,即:110

第四轮:
if dec:
      result = Dec2Bin(dec//2)   # 这个位置result的值是,7//2,即:3
      return result + str(dec%2)   # 这个位置 result 为 110 + 7%2,即:1110

第五轮:
if dec:
      result = Dec2Bin(dec//2)   # 这个位置result的值是,3//2,即:1
      return result + str(dec%2)   # 这个位置 result 为 1110 + 3%2,即:11110

第五轮:
if dec:
      result = Dec2Bin(dec//2)   # 这个位置result的值是,1//2,即:0
      return result + str(dec%2)   # 这个位置 result 为 11110 + 1%2,即:111110

第六轮:
if dec: # 为假,程序跳过此步骤

redaiconglin 发表于 2021-2-11 23:32:41

逃兵 发表于 2021-2-11 17:40
少打个百分号




= dec28in(1//2)
+ str((1)%2)
1 = dec28in(3//2)
1 + str((3)%2)
11 = dec28in(7//2)
11 + str((7)%2)
111 = dec28in(15//2)
111 + str((15)%2)
1111 = dec28in(31//2)
1111 + str((31)%2)
11111 = dec28in(62//2)
11111 + str((62)%2)
111110
老师运算得出的结果第一个输出dec不是应该是62吗 = dec28in(1//2)为什么是倒过来的第一个是1,反而最后显示的是62主要是这个地方我没有明白。感谢老师能帮我讲解一下吗谢谢了。

逃兵 发表于 2021-2-12 12:05:44

redaiconglin 发表于 2021-2-11 23:32
= dec28in(1//2)
+ str((1)%2)
1 = dec28in(3//2)


你还记得汉诺塔吗?

不论我们的参数是多少,移动的都会是第一个塔(X柱的最顶层)

递归实际上就是返回之前的某一步操作进行运算

这里也比喻为汉诺塔的话,第一个1相当于汉诺塔的顶层,之后层层返回到最后

你修改一下print的位置就能看到程序是怎么运行的

def dec28in(dec):
    result = ''
    if dec:
      print('return dec28in(%s//2) + str(%s%%2)'%(dec,dec))
      result = dec28in(dec//2)
      return result + str(dec%2)
      
    else:
      return result

redaiconglin 发表于 2021-2-12 12:19:02

逃兵 发表于 2021-2-12 12:05
你还记得汉诺塔吗?

不论我们的参数是多少,移动的都会是第一个塔(X柱的最顶层)


好的谢谢老师
页: [1]
查看完整版本: 各位老师这段代码报错格式化字符串没有足够的参数如何解决