Ряд Фибоначчи с использованием только основного метода рекурсивно

Я получил этот вопрос от моего друга, который прошел собеседование. Интервьюер попросил его Сгенерировать ряд Фибоначчи без использования какой-либо функции, кроме main. Это означает, что он должен был сгенерировать ряд Фибоначчи, рекурсивно вызвав функцию main(), но он не смог этого сделать. Я тоже пытался после его интервью, но все напрасно.

Может ли кто-нибудь рассказать свои идеи по этому поводу?


person kTiwari    schedule 12.09.2012    source источник
comment
Они указывали рекурсию или это только подразумевалось? Потому что вы можете сделать это в цикле for.   -  person Orin MacGregor    schedule 12.09.2012
comment
когда вы говорите не вызывать функцию, вы имеете в виду не вызывать библиотеку, которая сделает это за вас? Вызов main звучит как плохая идея   -  person RNJ    schedule 12.09.2012
comment
@OrinMacGregor: нет цикла ....   -  person kTiwari    schedule 12.09.2012
comment
@ruakh Нет цикла for, только рекурсия основного метода   -  person kTiwari    schedule 12.09.2012
comment
Моя идея: не идите работать в эту компанию.   -  person Keith Randall    schedule 12.09.2012
comment
Что ж, в java МОЖНО вызвать рекурсивно основной метод, но это довольно странно, поскольку массив args представляет собой массив строк, что означает, что вы должны добавить логику синтаксического анализа перед выполнением каких-либо вычислений... И вы также должны контролировать эту рекурсию. ..   -  person Fritz    schedule 12.09.2012
comment
@Gamb в C, вызывающий main (рекурсивно или нет), не определен, но вы можете избежать использования argc/argv и просто печатать серию, останавливающуюся, когда она достигает арифметического переполнения (это обязательно произойдет до переполнения стека)   -  person Kwariz    schedule 12.09.2012
comment
@Kwartz: если вы не можете указать соответствующий раздел языкового стандарта, рекурсия на main не не определена в C.   -  person John Bode    schedule 12.09.2012
comment
@ Только что заметил, что тег Java отключен, не говоря уже о моем комментарии :)   -  person Fritz    schedule 12.09.2012


Ответы (3)


Простой. В С:

#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]);}}

Меня возьмут на работу?

person Thomas    schedule 12.09.2012
comment
Нет. Неопределенное поведение, потому что %u должен получить беззнаковое целое число, но получает целое число :-) - person Jens; 12.09.2012
comment
Хорошо подмечено! Мой прототип работал с беззнаковыми целыми числами. Исправленный. Бьюсь об заклад, теперь это полностью определило поведение: P - person Thomas; 12.09.2012
comment
Не стандартное (объявление main не соответствует стандартной форме C), но хорошее решение. - person ouah; 12.09.2012
comment
@ouah: О, я думал, что это началось с 1 1. Исправлено. - person Thomas; 13.09.2012

#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(); 
}

Глупые вопросы на собеседовании... Ну, по крайней мере, он компилируется и дает точный результат для целых чисел.
Генерирует последовательность "рекурсивно" для всех целочисленных чисел Фибоначчи :)

person Kwariz    schedule 12.09.2012
comment
не таким образом, он был напечатан, но, поскольку мы знаем, что мы использовали функцию fabonacci как fob (n-2) + fob (n-1).... так я думаю - person kTiwari; 12.09.2012

#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
$ 
person ouah    schedule 12.09.2012