singlepost

Помогите решить задачку в Делфи пожалуйста! << На главную или назад  

Формулировка: Построить все последовательности длины n из 0 и 1 такие, чтобы в последовательности не было 2(или больше) подряд идущих единиц. Причем сделать это надо путем написания рекурсивной функции.

Я вообщем написал эту, мать ее, рекурсивную функцию перевода числа(одного) из десятичной системы счислен. в двоичную, а вот как дальше, как сделать чтобы она переводила массив чисел, и организовать отбор я понятия не имею. Помогите пожалуйста если кому не в лом!!! Ато я попал.

19 ответов в теме “Помогите решить задачку в Делфи пожалуйста!”

  1. 9
    Валерий Волков ответил:

    это?
    //+ USE Math;

    //сама рекурсивная проверка рядом стоящих единиц
    //в рекурсию передаем значение без последнего бита
    function Recurse(n:Integer):integer;
    begin
    if ((n or 3)=n) and (n>0)then Result:=1
    else
    if (n>0) Then Result:=Recurse(n div 2)
    else
    Result:=0;
    end;
    //Переводим число в двоичное представление
    //:) между прочим тоже рекурсивно :)
    function Int2BitStr(i:Integer):String;
    begin
    if (i>0) then
    if ((i or 1)=i) then
    Result:=Int2BitStr(i div 2)+'1'
    else
    Result:=Int2BitStr(i div 2)+'0'
    else
    Result:='';
    end;

    //Ну и реакция по кнопке….
    //забираем из одного поля максимальную длину последовательности
    //В другое поле записываем результат….
    //Если нужна последовательность только указанной длины – тогда
    //очень просто можно добавить необходимое количество нулей перед
    //полученной последовательностью :)
    procedure TForm1.Button1Click(Sender: TObject);
    var
    max:integer;
    i:Integer;
    b:Extended;
    begin
    memo1.Lines.Clear;
    b:=2;
    max:=Floor(IntPower(b, StrToInt(Edit1.Text)))-1;
    for i:=0 to max do
    if Recurse(i)=0 then Memo1.Lines.Add(Int2BitStr(i));
    end;

  2. 8
    Александр Тарасов ответил:

    лол

  3. 7
    Весельчак Джо ответил:

    да как ленин говорил, чем мы собственно и занимаемся)) а за помощь спасибо огромное!

  4. 6
    Весельчак Джо ответил:

    да хз мы ее вдвоем с напарником писали, для первого курса главное работает)

  5. 5
    Владимир Шакшин ответил:

    учицца вам еще и учицца… =)

  6. 4
    Владимир Шакшин ответил:

    Вопросы:
    1. нафик ты объявляешь нечто под названием "opa" если не используешь его?
    2. ты сам то понял что написал? =)особенно интересным и не вполне адекватным выглядит код:
    >if n = 0 then
    > result:='0'
    >else
    > result:='1';
    >if n = 0 then
    > result:=''
    >else
    >…
    в чем смысл первого "if"? следующим if-ом ты его действия перетираешь.

  7. 3
    Весельчак Джо ответил:

    functionPerevod(n : integer) : string;
    const
    opa : array [0..35] of char = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    var
    apap : integer;
    begin
    if n = 0 then
    result := '0'
    else
    result := '';
    if n=0 then result:=''
    else
    begin
    apap:=n mod 2;
    result:= perevod(n div 2)+inttostr(apap);
    end;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    ShowMessage(Perevod(5));
    end;

    end.

    тока там по моему мы лишка нагнали

  8. 2
    Владимир Шакшин ответил:

    а нафик тебе переводить числа из десятичной в двоичную???
    тебе поставлена задача построить все последовательности 0 и 1, так чтобы не было 2-х едениц подряд.

    procedure BuildSequence(Sequence:string;Size:byte);
    begin
    —if length(Sequence) = 0 then
    —begin
    ——BuildSequence('0',Size);
    ——BuildSequence('1',Size);
    ——exit;
    —end;
    —if length(Sequence) = Size then
    —begin
    ——WriteLn(Sequence);
    ——exit;
    —end;
    —BuildSequence(Sequence+'0',Size);
    —if Sequence[length(Sequence)]='0' then BuildSequence(Sequence+'1',Size);
    end;

  9. 1
    Владимир Шакшин ответил:

    а кстати, как ты написал рекурсивный перевод числа из одной системы в другую? код приведи.

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.