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 и выводит на экран.
Есть ли какие другие варианты? Может я неправильно понял задачу .
Кто хочет что-то сделать ищет возможность, кто не хочет — причину.
Здравствуйте, Zimy4, Вы писали:
Z>1. Поставлена задача: Z>Написать рекурсивную функцию сложения двух чисел, используя только прибавление единицы.(TurboPascal)
Z>Верно ли мое решение:
Не верно.
Во-первых используется "отнимание".
А во-вторых не работает с отрицательными числами.
Здравствуйте, 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.
Кто хочет что-то сделать ищет возможность, кто не хочет — причину.
Здравствуйте, Zimy4, Вы писали:
Z>Здравствуйте, bkat, Вы писали:
B>>Здравствуйте, Zimy4, Вы писали:
Z>>>1. Поставлена задача: Z>>>Написать рекурсивную функцию сложения двух чисел, используя только прибавление единицы.(TurboPascal)
Z>>>Верно ли мое решение:
B>>Не верно. B>>Во-первых используется "отнимание". Z>А по другому (без вычитания ) не получится или есть другие мысли?
Почему не получиться?
Для чего тебе вообще вычитание нужно?
Только чтобы определить когда надо прекратить прибавлять единички.
Т.е. тебе это нужно чтобы знать когда прекратить рекурсию.
Прекращаешь ты ее когда добираешься до 0
А кто сказал, что можно двигаться исключительно справа налево?
Можно ведь двигаться от нуля до какой-то точки останова
прибавляя единички...
Здравствуйте, 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;
В этом случае необязательно запоминать весь массив значений — нужно только распознавать последовательности повторяющихся значений и запоминать (начало, длину, значение) наиболее длинной серии.