面接を受けた友人からこの質問を受けました。インタビュアーは、 main 以外の関数を使用せずにフィボナッチ数列を生成するように彼に依頼しました。つまり、関数を再帰的に呼び出してフィボナッチ数列を生成することになっていましたmain()
が、それができませんでした。私も彼のインタビューの後に試みましたが、すべて無駄でした.
この点について、誰か自分の考えを教えてください。
単純。C:
#include<stdio.h>
main(b,a){a>b?main(1,0):printf("%d\n",a),main(a+b,b);}
Java では、より多くのコードとより多くのメモリが必要ですが、最大 65535 しかありません。
class F{public static void main(String[]v){int x=v.length,a,b;System
.out.println(a=x>>16);main(new String[(b=x&0xFFFF)+1<<16|a+b]);}}
私は雇われるだろうか?
#include <stdio.h>
int fib1=0;
int fib2=1;
int fib_tmp;
int main()
{
printf("%d ",fib1);
fib_tmp=fib1+fib2;
fib1=fib2;
fib2=fib_tmp;
if (fib1>0)
main();
}
愚かなインタビューの質問...少なくともそれはコンパイルされ、intの正確な結果をもたらします。
これは、すべてのint表現可能なフィボナッチ数に対して「再帰的に」シーケンスを生成します:)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
static int i = 0, j= 1;
int res, max;
/*
* You could add some check for argc and argv
*/
max = atoi(argv[1]);
printf("%d ", i);
res = i + j;
i = j;
j = res;
if (j > max)
{
printf("\n");
exit(0);
}
main(argc, argv);
}
例:
$ gcc -std=c99 -Wall tst.c -o tst
$ ./tst 1000
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610
$