整数除法

时间:2011-08-29 18:15:13

标签: pseudocode

我遇到了以下面试问题。

  

考虑这个函数声明:

void quiz(int i)
{
    if (i > 1)
    {
        quiz(i / 2);
        quiz(i / 2);
    }
    writeOutput("*");
}
     

函数调用quiz(5)打印了多少个星号?

我的回答是:

  

具有整数除法结果类型的语言(Javascript,PHP等)   浮 - 七个星号。函数测验被调用:

     
      
  1. i = 5 - 一次,星号打印。
  2.   
  3. i = 2.5 - 两次,打印星号。
  4.   
  5. i = 1.25 - 四次,打印星号。
  6.   
  7. i = 0.625 - 八次,没有打印星号
  8.         

    分割结果类型名称为的语言(C / C ++,C#,Java等)   整数 - 三个星号。函数测验被调用:

         
        
    1. i = 5 - 一次,星号打印。
    2.   
    3. i = 2 - 两次,打印星号。
    4.   
    5. i = 1 - 四次,星号未打印。
    6.         

      问题语法类似于C / C ++,Java,所以答案就是三个

访谈是a closed book exam - 在访谈期间,我无法运行此代码并进行检查。面试官告诉我,我的回答并不完全正确(或者至少,他们没想到会这样)。 Hovewer,我在家里运行了这段代码(使用PHP,Javascript和C#),结果就像我描述的那样。

那么,我是否遗漏了一些警告,或者我的答案比他们期望的更详细?

5 个答案:

答案 0 :(得分:5)

当i< = 1时,将调用writeOutput。

答案 1 :(得分:5)

如果您将代码更改为:

void quiz(int i)
{
    if (i > 1)
    {
        quiz(i / 2);
        quiz(i / 2);
    }
    printf("* for %d\n", i);
}

您会看到quiz(5)的结果是:

* for 1
* for 1
* for 2
* for 1
* for 1
* for 2
* for 5

所以,你得到了每个i的正确调用次数,你只是没注意到writeOutput在if之外,而不在其中。

答案 2 :(得分:1)

假设该函数将int作为参数,它(通常情况下)将永远不会将2.5作为参数。除非当然有人说#define double int,但在这种情况下,任何事情都不再可靠。

所以你的回答应该只是答案的第二部分。

答案 3 :(得分:1)

我在Java中得到7:

public class fun {



public void quiz(int i)
{

    if (i > 1)
    {
        quiz(i / 2);
        quiz(i / 2);
    }
    System.out.println("Value of i = " + i);
    System.out.println("*");
}

public static void main(String[] args){

    fun f = new fun();
    f.quiz(5);

}
}

输出=

Value of i = 1
*
Value of i = 1
*
Value of i = 2
*
Value of i = 1
*
Value of i = 1
*
Value of i = 2
*
Value of i = 5
*

有两件事使得这个简单的功能难以手动追踪。

第一:递归。递归函数使用调用堆栈,很难在纸上跟踪i的状态....特别是在采访中; - )

第二:像其他人说的那样,印刷品(*)在if ...之外...也许有点抓!

答案 4 :(得分:1)

我认为,如果你能提供复杂性分析,那么面试官会很高兴。 复杂度为2**ceil(lg(n))-1(其中**为幂运算符):

你可以通过写一棵树来形象化,我们得到的是一个严格而完整的二叉树(下面是n = 5,为简洁省略了几个节点)

           5
         /   \
        2     2
       / \   /  \
      1   1 1    1
     / \  ..........
    0   0 ..............

同样从这个问题来看,我不认为面试官期望对其他语言进行分析,例如python 3.x,其中默认行为是浮点除法,*将打印更多次。当预设浮点数时,调用次数为:2 ** (ceil(lg(n))+1) -1,(调用树将比整数除法更大,让我们作为练习:))

你可以运行这个python代码:

nCalls = 0
def quiz(n):
    global nCalls
    nCalls += 1
    if n>1:
        quiz(n/2)
        quiz(n/2)

test = [5, 9, 15]
for n in test:
    nCalls = 0
    quiz(n)
    print("nCalls for %d : %d" % (n,nCalls) )

on python 2.x :(整数除法)

nCalls for 5 : 7
nCalls for 9 : 15
nCalls for 15 : 15

on python 3.x :(浮点)

nCalls for 5 : 15
nCalls for 9 : 31
nCalls for 15 : 31

HTH。