面试官正在探究你对算法和编程范式的理解,试图了解你的培训、背景和深度。面试官有一个具有挑战性的任务;用最少的证据识别有能力的开发人员。 因此,面试官提出了一个构造问题,(他们希望) 引出所需的知识(候选人 X 是否知道如何解决问题 Y,或者理解概念 Z) 可能是因为面试官认为期望的答案表明候选人知道预期的知识体系。
现代语言提供了几种重复结构(命令、语句),一些是预测试的(在进入语句块之前检查条件),还有一些是后测试的(在执行语句块至少一次后检查条件)。以下是示例,
预测试
while(condition) statement-block
for(initializer;condition;step) statement-block
后测
do statement-block while(condition)
repeat statement-block until(condition)
do statement-block until(condition)
这些都可以写成带有分支(goto)的条件(选择)结构,
预测试
label:
if(condition)
statement-block;
goto label;
else
nil;
endif
后测
label:
statement-block;
if(condition)
goto label;
endif
您还可以使用递归,只要条件成立(或直到满足条件,取决于正逻辑或负逻辑),您就调用相同的函数,
预测试
function recurse(args)
if(condition)
statement-block
recurse(revised args);
endif
return
end #function
后测
function recurse(args)
statement-block
if(condition)
recurse(revised args);
endif
return;
end
您将在算法或可计算性课程中学习递归。您将了解编译器、高性能计算或系统类中的条件分支。您的编译器课程可能会检查检测“尾递归”的技术,以及如何将函数调用重写为循环。
这就是问题所在,重申一下,
given array, s[] = {5,1,0,4,2,3}
array length unknown
content between [0 .. length], not repeated, no duplicates
write subroutine which provides the number of steps to find given value
也就是说,
int length( array s, int member ) --> position
检查问题的条件(约束),
- 数组长度未知 - 解决方案必须适用于可变范围的输入
- 不能使用循环语句(for、while 等) - 这表明面试官想要条件分支或递归。
- 不能使用全局或静态变量 - 这是否表明面试官需要递归/函数式编程解决方案?条件分支也提供了这个。
- 不能在该例程中调用其他例程 - 面试官是指同一函数以外的函数,还是调用任何函数(面试官所说的“其他”是什么意思)。
- 无法修改函数参数,保持长度(s,n) - 允许声明本地(堆栈)变量。这可能意味着按值传递、制作本地副本等。但不是破坏性修改。
- 无法更改原始数组 - 绝对没有破坏性修改。可能的“提示”(可以制作本地副本吗?),或者进一步表明您应该使用条件分支?
这里有两个解决方案和一个测试驱动程序(注意,我将它们命名为 longi,iterative 和 lengthr,recursive)。
#include <stdio.h>
/* conditional branch */
int lengthi( int s[], int member )
{
int position=0;
AGAIN:
if( s[position] == member ) return(position);
++position;
goto AGAIN;
return(-1);
}
/* recursive */
int lengthr( int s[], int member )
{
if( s[0] == member ) return(0);
return( 1+length(s+1,member) );
}
int
main(int argc,char* argv[])
{
int s1[] = {0,1,2,3,4,5,6,7,8,9};
int s2[] = {1,2,3,4,9,8,7,6,0,5};
int s3[] = {2,4,6,8,0,1,3,5,7,9};
printf("%d at %d\n",3,lengthr(s1,3));
printf("%d at %d\n",3,lengthr(s2,3));
printf("%d at %d\n",3,lengthr(s3,3));
printf("%d at %d\n",3,lengthi(s1,3));
printf("%d at %d\n",3,lengthi(s2,3));
printf("%d at %d\n",3,lengthi(s3,3));
}
由于我们应该找到步骤数(迭代、函数调用),因此要求的是列表中的序数位置,而不是 C 索引(从零开始)的位置。
这是一个面试问题,而不是编程问题(本身),因此可能更适合Programmers.stackexchange 网站。 我可能会给面试官一个有趣的答案,或者他们想要的答案。