我遇到了以下面试问题。
考虑这个函数声明:
void quiz(int i) { if (i > 1) { quiz(i / 2); quiz(i / 2); } writeOutput("*"); }
函数调用
quiz(5)
打印了多少个星号?
我的回答是:
具有整数除法结果类型的语言(Javascript,PHP等) 浮 - 七个星号。函数测验被调用:
- i = 5 - 一次,星号打印。
- i = 2.5 - 两次,打印星号。
- i = 1.25 - 四次,打印星号。
- i = 0.625 - 八次,没有打印星号
醇>分割结果类型名称为的语言(C / C ++,C#,Java等) 整数 - 三个星号。函数测验被调用:
- i = 5 - 一次,星号打印。
- i = 2 - 两次,打印星号。
- i = 1 - 四次,星号未打印。
醇>问题语法类似于C / C ++,Java,所以答案就是三个
访谈是a closed book exam
- 在访谈期间,我无法运行此代码并进行检查。面试官告诉我,我的回答并不完全正确(或者至少,他们没想到会这样)。 Hovewer,我在家里运行了这段代码(使用PHP,Javascript和C#),结果就像我描述的那样。
那么,我是否遗漏了一些警告,或者我的答案比他们期望的更详细?
答案 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。