Задачка для программистов№ 1
Gunslinger

Сразу предупреждаю, у этой задачи скорее всего нету решения.
Но я не уверен и поэтому я здесь
Я правильного решения не нашел

Итак:
Язык С.
Напишите рекурсивную функцию которая принимает ОДИН параметр N
и ресует два прямых треугольника. Один противоположный другому.
звездочками естественно N - максимальное количество звездочек в одной строке.
Пример: Для N = 4:
*
**
***
****
****
***
**
*

Условия:
Для решения данной задачи нельзя пользоваться (циклами) FOR/While и т.д
Но можно написать и использовать ОДНУ вспомогательную функцию.
На данном этапе у задачи есть решение.
Но есть еще одно условие которое я поставлю после того как кто нибудь решит эту задачу в данном варианте

Взято из << Домашнего задания для Студнтов "Тохна" в Колледже Брауда (Кармиэель) "Хороший такой колледж" 2 Семестр. Профессор задавшая данную задачу не захотела показать правильное решение.>>
 Выбор всегда остается за нами. Всегда - за нами. Мы идем вперед, мы торопимся, но хватит ли нам отваги прервать движение, остановится, превозмогая страх, и повернутся спиной к опасности или счастью, которые всегда впереди, и лицом к выбору, который всегда, вечно, неумолимо и невидимо остается за нами. (ц.) H.L.Oldie
Профиль 

Задачка для программистов№ 2
yxo

Пример проги: (даже не поленился раскрасить )

#include <stdio.h>

void asterik(int n) {
if (n == 0) {
    printf("\n" );
    return;
}
   
if (n < 0) {
    printf("*" );
    asterik(n+1);      
} else {
    printf("*" );
    asterik(n-1);      
}
}

void draw(int n) {
static int start = 0;
static int stop = 0;

if (start == 0) {
    start = n;
    stop = -n;
}

if ((n < 0) && (n >= stop)) {
   asterik(n);
   draw(n+1);
}
   
if (n > 0) {
    draw(n-1);   
    asterik(n);
}

if (n == start) {
    n = stop;
    draw(n);
}
}


int main() {
draw(10);
}


На STDOUT выдаёт для 10:
*
**
***
****
*****
******
*******
********
*********
**********
**********
*********
********
*******
******
*****
****
***
**
*
 ...и днем и ночью учёный всё ходит по цепи кругом...
[ 13-08-05, Сбт, 20:00:32 Отредактировано: yxo ]
Профиль 

Задачка для программистов№ 3
Большой Грызь

Замени первый вызов asterik (n) (в if ((n < 0) && (n >= stop)) на asterik(-n) и тогда функцию asterik можно сократить в два раза

Но со static-ами неинтересно.. Это сродни глобальным переменным.. Т.е. по сути получается, что функция draw работает не с одним параметром, а с тремя...

А вот сделать действительно с одним параметром и без статик-ов?
 Жизнь человека немного стоит по сравнению с его делом.
Но чтобы делать дело, надо жить.
(Э. Хемингуэй)
Профиль 

Задачка для программистов№ 4
Gunslinger

Вот это и есть последнее условие.
Без статичных и без глобальных переменных.
Но я все таки думаю что такого решения нет.

Вот кстати мое решение со static-ом:
void printStars(int nStars)
{
   if (nStars==0)
   {
      printf("\n" );
      return;
   }
   printf("*" );
   printStars(nStars-1);
}

void printME(int n)
{
   static int nMax = 0;
   if (nMax == 0)
   {
         nMax = n;
         n=1;
   }

    if (n > nMax)
      return;

   printStars(n);
   printME(n+1);
   printStars(n);
}

int main() {
   printME(10);
   return 0;
}

ПС: Грызь, а слабо кнопку сделать для цитирования кода?
ПС2: А может кто нибудь сюда еще таких задачек подкинет?
 Выбор всегда остается за нами. Всегда - за нами. Мы идем вперед, мы торопимся, но хватит ли нам отваги прервать движение, остановится, превозмогая страх, и повернутся спиной к опасности или счастью, которые всегда впереди, и лицом к выбору, который всегда, вечно, неумолимо и невидимо остается за нами. (ц.) H.L.Oldie
[ 13-08-05, Сбт, 21:05:02 Отредактировано: Gunslinger ]
[ 13-08-05, Сбт, 21:21:47 Отредактировано: Gunslinger ]
[ 13-08-05, Сбт, 21:22:53 Отредактировано: Gunslinger ]
Профиль 

Задачка для программистов№ 5
Большой Грызь

Gunslinger, т.е. можно пользоваться одной вспомогательной функцией, но нельзя пользоваться глобальными и статическими?
А есть ограничение на кол-во параметров во вспомогательной функции? И обязательно ли главная функция должна быть рекурсивной?

А то, если на оба вопроса ответ "необязательно", то решение почти примитивное
 Жизнь человека немного стоит по сравнению с его делом.
Но чтобы делать дело, надо жить.
(Э. Хемингуэй)
Профиль 

Задачка для программистов№ 6
Большой Грызь

ПС: Грызь, а слабо кнопку сделать для цитирования кода?

В смысле?
ПС2: А может кто нибудь сюда еще таких задачек подкинет?

Да запросто
Я их и сам выдумывал когда-то..

Вот только решу эту задачу и подкину новую.
 Жизнь человека немного стоит по сравнению с его делом.
Но чтобы делать дело, надо жить.
(Э. Хемингуэй)
Профиль 

Задачка для программистов№ 7
Gunslinger

не не катит.
я тоже сначала подумал зделать одну такую функцию:
printMain(int N)
{
DoPrint(1,N);
}


но главная функция та которая принимает N - должна быть рекурсивной.
а насчет вспомагательной - ограничений на количество параметров нет.
 Выбор всегда остается за нами. Всегда - за нами. Мы идем вперед, мы торопимся, но хватит ли нам отваги прервать движение, остановится, превозмогая страх, и повернутся спиной к опасности или счастью, которые всегда впереди, и лицом к выбору, который всегда, вечно, неумолимо и невидимо остается за нами. (ц.) H.L.Oldie
Профиль 

Задачка для программистов№ 8
Большой Грызь

Буем думать.
 Жизнь человека немного стоит по сравнению с его делом.
Но чтобы делать дело, надо жить.
(Э. Хемингуэй)
Профиль 

Задачка для программистов№ 9
Gunslinger

В смысле что бы не трогал пробелы в коде.
и синтаксис подсвечивал сам.
 Выбор всегда остается за нами. Всегда - за нами. Мы идем вперед, мы торопимся, но хватит ли нам отваги прервать движение, остановится, превозмогая страх, и повернутся спиной к опасности или счастью, которые всегда впереди, и лицом к выбору, который всегда, вечно, неумолимо и невидимо остается за нами. (ц.) H.L.Oldie
Профиль 

Задачка для программистов№ 10
Большой Грызь

Ну, с подсвечиванием синтаксиса - это за рамками
А то сегодня будем подсвечивать С/С++, а завтра - Visual Basic, FoxPro и MatLab. Где я наберу таблицы со списком зарезервированных слов..

Пробелы для табуляции - ставьте по три пробела (они сконвертируются в &nbsр;&nbsр;&nbsр; - т.е. будут именно тремя пробелами).
 Жизнь человека немного стоит по сравнению с его делом.
Но чтобы делать дело, надо жить.
(Э. Хемингуэй)
Профиль 

Задачка для программистов№ 11
yxo

ВСЁ СТЕР ..... не отвечает условиям. Будем думать. Но уже завтра.
 ...и днем и ночью учёный всё ходит по цепи кругом...
[ 13-08-05, Сбт, 21:47:35 Отредактировано: yxo ]
Профиль 

Задачка для программистов№ 12
Большой Грызь

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

Задачка для программистов№ 13
Урод и мразь

#include <stdio.h>


void asterik(int n)
{
&nbsp;&nbsp;&nbsp;if (n>0)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("*" );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asterik(n-1);
&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\n" );
}


void draw(int n)
{
&nbsp;&nbsp;&nbsp;if (n>0)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;draw(-2*n);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;draw(-2*n-1);
&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;else if (n<0 && n%2==0)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;draw(n+2);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asterik(-n/2);
&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;else if (n<-1 && n%2!=0)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asterik(-n/2);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;draw(n+2);
&nbsp;&nbsp;&nbsp;}
}

int main() {draw(10);}
 Жизнь - игра на ациклическом графе, а свобода - позиция, для которой есть >1 стратегии выигрыша.
Профиль 

Задачка для программистов№ 14
Большой Грызь

УиМ, угу... но я такое забраковал.. Потому что из-за умножения может не поместиться в int.
 Жизнь человека немного стоит по сравнению с его делом.
Но чтобы делать дело, надо жить.
(Э. Хемингуэй)
Профиль 

Задачка для программистов№ 15
Урод и мразь

Если вспомогательная может иметь больше 1 параметра, то решение тривиально.
 Жизнь - игра на ациклическом графе, а свобода - позиция, для которой есть >1 стратегии выигрыша.
Профиль 

Задачка для программистов№ 16
Большой Грызь

Может иметь и больше
Какое решение?
 Жизнь человека немного стоит по сравнению с его делом.
Но чтобы делать дело, надо жить.
(Э. Хемингуэй)
Профиль 

Задачка для программистов№ 17
Урод и мразь

Да можно обойтись и 1 параметром.

Основная функция при отрицательном n просто печатает n звёздочек (рекурсивно).
Вспомогательная функция печатает верхний или нижний треугольник в зависимости от знака n.
 Жизнь - игра на ациклическом графе, а свобода - позиция, для которой есть >1 стратегии выигрыша.
Профиль 

Задачка для программистов№ 18
Большой Грызь

Нарисуй
 Жизнь человека немного стоит по сравнению с его делом.
Но чтобы делать дело, надо жить.
(Э. Хемингуэй)
Профиль 

Задачка для программистов№ 19
yxo

Что ? Совсем тривиальное ?!.... Переквалифицироваться надо . Грызь ! Пошли цветочки собирать, а ?

К сабжу: УиМ ! Н А Р И С У Й !

Кстати, для чиска N в n бит, задачу можно решить с помощью регистра в 2n бит:
1. Копируем n бит числа N в 2 старших байта регистра А (размером в 2n) и в
   2 младших байта этого-же регистра.
2. В функции draw() рисуем звездочки (вызываем asterik()), уменьшая 2 нижних байта А
   на один, пока они не обнулятся.
3. После обнуления двух нижних байтов, переходим к двум верхним, уменьшая их на один
   в каждом рекурсивном проходе функции draw(). Звёздочки, естественно, рисуем в
   обратном порядке (к пункту 2).

Как ?
 ...и днем и ночью учёный всё ходит по цепи кругом...
Профиль 

Задачка для программистов№ 20
Урод и мразь

Автор: yxo
Дата : 14-08-05, Вск, 09:18:13

Кстати, для чиска N в n бит, задачу можно решить с помощью регистра в 2n бит:


Моя программа (пост № 13) требует всего лишь 1 лишний бит - и то Грызь боится, что не влезет в int.
 Жизнь - игра на ациклическом графе, а свобода - позиция, для которой есть >1 стратегии выигрыша.
Профиль 

Задачка для программистов№ 21
Урод и мразь

#include <stdio.h>

void draw(int n);

void triangle(int n)
{
&nbsp;&nbsp;&nbsp;if (n>0)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;triangle(n-1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;draw(-n);
&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;else if (n<0)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;draw(n);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;triangle(n+1);
&nbsp;&nbsp;&nbsp;}
}


void draw(int n)
{
&nbsp;&nbsp;&nbsp;if (n<0)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("*" );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;draw(n+1);
&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;else if (n == 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\n" );
&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;triangle(n);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;triangle(-n);
&nbsp;&nbsp;&nbsp;}
}

int main() {draw(10);}
 Жизнь - игра на ациклическом графе, а свобода - позиция, для которой есть >1 стратегии выигрыша.
Профиль 

Задачка для программистов№ 22
Большой Грызь

Нее, рубяты с лишними битами и умножениями не пойдёт. Бо тогда можно побитно разбить один разрешённый параметр хоть на целых три параметра. Что позволит вообще выкинуть вспомогательную функцию - с тремя параметрами тривиально решается безо всяких вспомогательных функций (например, параметры: cur_pos_in_line, cur_line_len, max_line_len). Так неинтересно, ибо накладывает ограничение на максимальное значение N.
Скажем так.. функция УиМа не сработает при вызове draw (MAX_INT).
 Жизнь человека немного стоит по сравнению с его делом.
Но чтобы делать дело, надо жить.
(Э. Хемингуэй)
Профиль 

Задачка для программистов№ 23
Большой Грызь

А вот это куда интереснее
Надо проверить...
До двойной рекурсии не додумался
 Жизнь человека немного стоит по сравнению с его делом.
Но чтобы делать дело, надо жить.
(Э. Хемингуэй)
Профиль 

Задачка для программистов№ 24
yxo

Грызь, а как ты предполагаешь сохранять state в той же переменной, которую ты изменяешь ?

УиМ Ясно, что твой один бит рулит ! Просто я привел пример формализации вопроса: клиент программы будет знать, что может использовать n бит максимум и получить искомый результат. В посте #13, этого не указанно. Ясно, что твоё решение завалится на underflow для определенных N.

Грызь ? А где твои предложения ?
 ...и днем и ночью учёный всё ходит по цепи кругом...
Профиль 

Задачка для программистов№ 25
Большой Грызь

Моих предложений нет
Потому что те, что были - совпадают с теми, что тут написали и были забракованы.
В частности - с умножением на два (один в один) и с глобальными переменными.
А идеального решения не придумал. Тупой
 Жизнь человека немного стоит по сравнению с его делом.
Но чтобы делать дело, надо жить.
(Э. Хемингуэй)
Профиль 

Задачка для программистов№ 26
yxo

УиМ -- гардюсь ! Молодец.
БГ -- ну шо ? Цветочки ?
 ...и днем и ночью учёный всё ходит по цепи кругом...
Профиль 

Задачка для программистов№ 27
Gunslinger

УиМ - респект.
Таки надо идти цветы собирать
 Выбор всегда остается за нами. Всегда - за нами. Мы идем вперед, мы торопимся, но хватит ли нам отваги прервать движение, остановится, превозмогая страх, и повернутся спиной к опасности или счастью, которые всегда впереди, и лицом к выбору, который всегда, вечно, неумолимо и невидимо остается за нами. (ц.) H.L.Oldie
Профиль 


Вы не зарегистрированы либо не вошли в портал!!!
Регистрация или вход в портал - в главном меню.



 Просмотров:   004178    Постингов:   000027