Re: Рекурсивная функция сложеня двух чисел.
От: bkat  
Дата: 24.05.07 12:32
Оценка: 1 (1)
Здравствуйте, Zimy4, Вы писали:

Z>1. Поставлена задача:

Z>Написать рекурсивную функцию сложения двух чисел, используя только прибавление единицы.(TurboPascal)

Z>Верно ли мое решение:


Не верно.
Во-первых используется "отнимание".
А во-вторых не работает с отрицательными числами.
Рекурсивная функция сложеня двух чисел.
От: Zimy4  
Дата: 24.05.07 07:28
Оценка:
1. Поставлена задача:
Написать рекурсивную функцию сложения двух чисел, используя только прибавление единицы.(TurboPascal)

Верно ли мое решение:

var a : integer;
    b : integer;

function Summ(x, y:integer):integer;
begin
     if y = 0 then Summ := x
     else Summ := Summ(x,y-1)+1;
end;

begin
    Write('Введите A: ');
    Readln(a);
    Write('Введите B: ');
    Readln(b);
    Write(a, '+', b, '=', Summ(a,b));
end.

В принципе оно работает, но вот соответствует ли оно условию задачи "используя только прибавление единицы".

2. Об вторую задачу моск себе сломал....немогу понять входные данные, если можно разъясните:

Руководство фирмы анализирует работу за последние К лет. Одна из задач, кото-рая решается,
заключается в определении самого длительного
промежутка времени, в тече-ние которого некий обобщенный показатель М
работы фирмы был постоянный. Написать программу определения и вывода на экран
данного временного интервала (указать год нача-ла и год конца данного участка).

Мое решение:
пользователь вводит:
K — количество лет (например: 10)
затем вводит К раз:
ArrayYear[K] — год и ArrayM[K] обобщенный показатель. можно конечно использовать запись:
Data = record
    Year : Integer;     { Год }
    M     : LongInt;     { Показатель }
end;


затем программа запрашивает, какой показатель M следует искать.
ищет в массиве ArrayM максимальную последовательность M и выводит на экран.

Есть ли какие другие варианты? Может я неправильно понял задачу .
Кто хочет что-то сделать ищет возможность, кто не хочет — причину.
Re[2]: Рекурсивная функция сложеня двух чисел.
От: Zimy4  
Дата: 25.05.07 06:49
Оценка:
Здравствуйте, bkat, Вы писали:

B>Здравствуйте, Zimy4, Вы писали:


Z>>1. Поставлена задача:

Z>>Написать рекурсивную функцию сложения двух чисел, используя только прибавление единицы.(TurboPascal)

Z>>Верно ли мое решение:


B>Не верно.

B>Во-первых используется "отнимание".
А по другому (без вычитания ) не получится или есть другие мысли?

B>А во-вторых не работает с отрицательными числами.


Я понял и переделал теперь так:

var NumA : integer;
    NumB : integer;

function Summ(a, b:integer):integer;
begin
    if b = 0 then Summ := a
    else if b > 0 then Summ := Summ(a, b-1) + 1
         else Summ := Summ(a, b+1) - 1;

end;

begin
    Write('Введите A: ');
    Readln(NumA);
    Write('Введите B: ');
    Readln(NumB);
    WriteLn(NumA, '+', NumB, '=',Summ(NumA, NumB));
end.
Кто хочет что-то сделать ищет возможность, кто не хочет — причину.
Re[3]: Рекурсивная функция сложеня двух чисел.
От: bkat  
Дата: 25.05.07 08:54
Оценка:
Здравствуйте, Zimy4, Вы писали:

Z>Здравствуйте, bkat, Вы писали:


B>>Здравствуйте, Zimy4, Вы писали:


Z>>>1. Поставлена задача:

Z>>>Написать рекурсивную функцию сложения двух чисел, используя только прибавление единицы.(TurboPascal)

Z>>>Верно ли мое решение:


B>>Не верно.

B>>Во-первых используется "отнимание".
Z>А по другому (без вычитания ) не получится или есть другие мысли?

Почему не получиться?
Для чего тебе вообще вычитание нужно?
Только чтобы определить когда надо прекратить прибавлять единички.
Т.е. тебе это нужно чтобы знать когда прекратить рекурсию.
Прекращаешь ты ее когда добираешься до 0
А кто сказал, что можно двигаться исключительно справа налево?
Можно ведь двигаться от нуля до какой-то точки останова
прибавляя единички...

Ну это так, мысли
Дальше сам думай
Re[4]: Рекурсивная функция сложеня двух чисел.
От: Zimy4  
Дата: 25.05.07 12:42
Оценка:
Здравствуйте, bkat,

Сэнкс! Я уже разобрался
Кто хочет что-то сделать ищет возможность, кто не хочет — причину.
Re: Рекурсивная функция сложеня двух чисел.
От: Кодт Россия  
Дата: 04.06.07 13:33
Оценка:
Здравствуйте, Zimy4, Вы писали:

Z>1. Поставлена задача:

Z>Написать рекурсивную функцию сложения двух чисел, используя только прибавление единицы.(TurboPascal)

Что именно интереснее сделать — реализовать числа Чёрча или функцию Аккермана?
(Впрочем, на Паскале числа Чёрча особо не сделаешь — придётся реализовывать замыкания вручную).
(А функция Аккермана — это, конечно, избыточно. Но можно порадовать препода )

Z>Верно ли мое решение:

Z>function Summ(x, y:integer):integer;
Z>begin
Z>     if y = 0 then Summ := x
Z>     else Summ := Summ(x,y-1)+1;
Z>end;

Z>В принципе оно работает, но вот соответствует ли оно условию задачи "используя только прибавление единицы".

Тут мы ещё наблюдаем вычитание единицы. Вообще-то, для чисел Чёрча декремент необязателен — но см. () выше.
С другой стороны, арифметику можно определить через +1, -1, =0, а можно и через +1 и = между любыми числами.
function Summ(x,y: integer): integer;
var i: integer;
begin
    for i:=1 to y do x:=x+1;
    (* или, что более точно намекает на ответ *)
    i:=1;
    while i<>y do begin
        i:=i+1;
        x:=x+1;
    end;
    
    Summ:=x;
end;

Попробуй превратить цикл в рекурсию.

Z>2. Об вторую задачу моск себе сломал....немогу понять входные данные, если можно разъясните:


Z>Руководство фирмы анализирует работу за последние К лет. Одна из задач, кото-рая решается,

Z>заключается в определении самого длительного
Z>промежутка времени, в тече-ние которого некий обобщенный показатель М
Z>работы фирмы был постоянный. Написать программу определения и вывода на экран
Z>данного временного интервала (указать год нача-ла и год конца данного участка).

Думаю, что не нужно усложнять себе жизнь. Пользователь вводит только один-единственный показатель за ряд лет. Ну скажем, так:
var
    YearOfBegin, YearOfEnd, K, Year: integer;
    M: integer;
begin
    write('какой нынче год: '); readln(YearOfEnd);
    write('за сколько лет : '); readln(K);
    YearOfBegin := YearOfEnd - K + 1;
    for Year := YearOfBegin to YearOfEnd do begin
        write('показатель за ', Year, ' год: '); readln(M);
        .....
    end;
end;

В этом случае необязательно запоминать весь массив значений — нужно только распознавать последовательности повторяющихся значений и запоминать (начало, длину, значение) наиболее длинной серии.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.