为什么我执行此代码时会打印inf?

时间:2020-06-22 18:32:54

标签: python c recursion

def recur(a): 
  if( (a/2)!=0): 
    return recur(a/2) * 10+a%2
  else: 
      return 1
c=recur(10)
print(c)
当我执行此代码时,

inf将被打印。任何人都可以解释我的错误和此代码。 (我将此代码从C转换为python;原始代码如下)

#include <stdio.h>
int recur(int n)
{
    if((n/2)!=0)
     return (recur(n/2)*10+n%2);
    
    else
      return 1;
}
int main()
{ int d;
d=recur(10);
    printf("%d",d);

    return 0;
}

输出 1010

2 个答案:

答案 0 :(得分:8)

Python 3中的除法运算符/是浮点除法,因此循环将永远运行。用//代替并感到高兴。

答案 1 :(得分:1)

在评论中回答问题,这是如何获得1010的结果。
让我们跟踪recur的执行:

recur( 10 )
  return recur( 5 ) * 10 + 10 % 2 ---------+
    return recur( 2 ) * 10 + 5 % 2 ------+ |
      return recur( 1 ) * 10 + 2 % 2 --+ | |
        return 1                       | | |
      1 * 10 + 2 % 2 == 10 + 0 == 10 <-+ | |
    10 * 10 + 5 % 2 == 100 + 1 == 101 <--+ |
  101 * 10 + 10 % 2 == 1010 + 0 == 1010 <--+

IOW,为了计算recur(10)的结果,我们计算recur(10/2)recur(5)的结果,将其乘以10,然后加上{{ 1}}(10 % 2)。

要计算0的结果,我们计算recur(5)recur(5/2)的结果,将其乘以recur(2),然后将{{1} }(10

要计算5 % 2的结果,我们计算1recur(2)的结果,将其乘以recur(2/2),然后将{{1} }(recur(1)

10,因此2 % 2的结果为01/2 == 0recur(1),因此1的结果为1 * 10 + 2 % 210recur(2),因此10的结果为10 * 10 + 5 % 2。最后,101的结果是recur(5),所以这就是101的结果。

在C中,整数除法会产生整数结果,因此101 * 10 + 10 % 21010等。