我面临以下面试问题.
考虑这个函数声明:
Run Code Online (Sandbox Code Playgroud)void quiz(int i) { if (i > 1) { quiz(i / 2); quiz(i / 2); } writeOutput("*"); }函数调用打印了多少个星号
quiz(5)?
我的回答是:
具有整数除法结果类型的语言(Javascript,PHP等)是float - 七个星号.函数测验被调用:
- 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#),结果就像我描述的那样.
那么,是否有一些我不知道的警告或者我的答案比他们期望的更详细?
如果您将代码更改为:
void quiz(int i)
{
if (i > 1)
{
quiz(i / 2);
quiz(i / 2);
}
printf("* for %d\n", i);
}
Run Code Online (Sandbox Code Playgroud)
你会看到结果quiz(5)是:
* for 1
* for 1
* for 2
* for 1
* for 1
* for 2
* for 5
Run Code Online (Sandbox Code Playgroud)
所以,你得到了每个i的正确调用次数,你只是没有注意到writeOutput在if之外,而不在其中.