|
Gunslinger
|
Дата : 13-08-05, Сбт, 01:54:49
Сразу предупреждаю, у этой задачи скорее всего нету решения. Но я не уверен и поэтому я здесь Я правильного решения не нашел
Итак: Язык С. Напишите рекурсивную функцию которая принимает ОДИН параметр N и ресует два прямых треугольника. Один противоположный другому. звездочками естественно N - максимальное количество звездочек в одной строке. Пример: Для N = 4: * ** *** **** **** *** ** *
Условия: Для решения данной задачи нельзя пользоваться (циклами) FOR/While и т.д Но можно написать и использовать ОДНУ вспомогательную функцию. На данном этапе у задачи есть решение. Но есть еще одно условие которое я поставлю после того как кто нибудь решит эту задачу в данном варианте
Взято из << Домашнего задания для Студнтов "Тохна" в Колледже Брауда (Кармиэель) "Хороший такой колледж" 2 Семестр. Профессор задавшая данную задачу не захотела показать правильное решение.>> |
| Выбор всегда остается за нами. Всегда - за нами. Мы идем вперед, мы торопимся, но хватит ли нам отваги прервать движение, остановится, превозмогая страх, и повернутся спиной к опасности или счастью, которые всегда впереди, и лицом к выбору, который всегда, вечно, неумолимо и невидимо остается за нами. (ц.) H.L.Oldie |
|
|
|
Gunslinger
|
Дата : 13-08-05, Сбт, 14:02:00
Вот это и есть последнее условие. Без статичных и без глобальных переменных. Но я все таки думаю что такого решения нет.
Вот кстати мое решение со 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 ] |
|
|
|
Большой Грызь
|
Дата : 13-08-05, Сбт, 14:07:21
ПС: Грызь, а слабо кнопку сделать для цитирования кода?
В смысле?
ПС2: А может кто нибудь сюда еще таких задачек подкинет?
Да запросто Я их и сам выдумывал когда-то..
Вот только решу эту задачу и подкину новую. |
| Жизнь человека немного стоит по сравнению с его делом. Но чтобы делать дело, надо жить. (Э. Хемингуэй) |
|
|
|
Gunslinger
|
Дата : 13-08-05, Сбт, 14:10:13
не не катит. я тоже сначала подумал зделать одну такую функцию: printMain(int N) { DoPrint(1,N); }
но главная функция та которая принимает N - должна быть рекурсивной. а насчет вспомагательной - ограничений на количество параметров нет. |
| Выбор всегда остается за нами. Всегда - за нами. Мы идем вперед, мы торопимся, но хватит ли нам отваги прервать движение, остановится, превозмогая страх, и повернутся спиной к опасности или счастью, которые всегда впереди, и лицом к выбору, который всегда, вечно, неумолимо и невидимо остается за нами. (ц.) H.L.Oldie |
|
|
|
Большой Грызь
|
Дата : 13-08-05, Сбт, 14:11:33
Буем думать. |
| Жизнь человека немного стоит по сравнению с его делом. Но чтобы делать дело, надо жить. (Э. Хемингуэй) |
|
|
|
Gunslinger
|
Дата : 13-08-05, Сбт, 14:12:38
В смысле что бы не трогал пробелы в коде. и синтаксис подсвечивал сам.
|
| Выбор всегда остается за нами. Всегда - за нами. Мы идем вперед, мы торопимся, но хватит ли нам отваги прервать движение, остановится, превозмогая страх, и повернутся спиной к опасности или счастью, которые всегда впереди, и лицом к выбору, который всегда, вечно, неумолимо и невидимо остается за нами. (ц.) H.L.Oldie |
|
|
|
Урод и мразь
|
Дата : 13-08-05, Сбт, 20:06:59
#include <stdio.h>
void asterik(int n) { if (n>0) { printf("*" ); asterik(n-1); } else printf("\n" ); }
void draw(int n) { if (n>0) { draw(-2*n); draw(-2*n-1); } else if (n<0 && n%2==0) { draw(n+2); asterik(-n/2); } else if (n<-1 && n%2!=0) { asterik(-n/2); draw(n+2); } }
int main() {draw(10);} |
| Жизнь - игра на ациклическом графе, а свобода - позиция, для которой есть >1 стратегии выигрыша. |
|
|
|
Большой Грызь
|
Дата : 13-08-05, Сбт, 23:18:35
УиМ, угу... но я такое забраковал.. Потому что из-за умножения может не поместиться в int. |
| Жизнь человека немного стоит по сравнению с его делом. Но чтобы делать дело, надо жить. (Э. Хемингуэй) |
|
|
|
Урод и мразь
|
Дата : 14-08-05, Вск, 00:27:32
Если вспомогательная может иметь больше 1 параметра, то решение тривиально. |
| Жизнь - игра на ациклическом графе, а свобода - позиция, для которой есть >1 стратегии выигрыша. |
|
|
|
Урод и мразь
|
Дата : 14-08-05, Вск, 00:53:29
Да можно обойтись и 1 параметром.
Основная функция при отрицательном n просто печатает n звёздочек (рекурсивно). Вспомогательная функция печатает верхний или нижний треугольник в зависимости от знака n. |
| Жизнь - игра на ациклическом графе, а свобода - позиция, для которой есть >1 стратегии выигрыша. |
|
|
|
yxo
|
Дата : 14-08-05, Вск, 02:18:13
Что ? Совсем тривиальное ?!.... Переквалифицироваться надо . Грызь ! Пошли цветочки собирать, а ?
К сабжу: УиМ ! Н А Р И С У Й !
Кстати, для чиска N в n бит, задачу можно решить с помощью регистра в 2n бит: 1. Копируем n бит числа N в 2 старших байта регистра А (размером в 2n) и в 2 младших байта этого-же регистра. 2. В функции draw() рисуем звездочки (вызываем asterik()), уменьшая 2 нижних байта А на один, пока они не обнулятся. 3. После обнуления двух нижних байтов, переходим к двум верхним, уменьшая их на один в каждом рекурсивном проходе функции draw(). Звёздочки, естественно, рисуем в обратном порядке (к пункту 2).
Как ?
|
| ...и днем и ночью учёный всё ходит по цепи кругом... |
|
|
|
Урод и мразь
|
Дата : 14-08-05, Вск, 02:30:26
Автор: yxo Дата : 14-08-05, Вск, 09:18:13
Кстати, для чиска N в n бит, задачу можно решить с помощью регистра в 2n бит:
Моя программа (пост № 13) требует всего лишь 1 лишний бит - и то Грызь боится, что не влезет в int. |
| Жизнь - игра на ациклическом графе, а свобода - позиция, для которой есть >1 стратегии выигрыша. |
|
|
|
Урод и мразь
|
Дата : 14-08-05, Вск, 02:40:09
#include <stdio.h>
void draw(int n);
void triangle(int n) { if (n>0) { triangle(n-1); draw(-n); } else if (n<0) { draw(n); triangle(n+1); } }
void draw(int n) { if (n<0) { printf("*" ); draw(n+1); } else if (n == 0) printf("\n" ); else { triangle(n); triangle(-n); } }
int main() {draw(10);} |
| Жизнь - игра на ациклическом графе, а свобода - позиция, для которой есть >1 стратегии выигрыша. |
|
|
|
Gunslinger
|
Дата : 14-08-05, Вск, 07:56:57
УиМ - респект. Таки надо идти цветы собирать
|
| Выбор всегда остается за нами. Всегда - за нами. Мы идем вперед, мы торопимся, но хватит ли нам отваги прервать движение, остановится, превозмогая страх, и повернутся спиной к опасности или счастью, которые всегда впереди, и лицом к выбору, который всегда, вечно, неумолимо и невидимо остается за нами. (ц.) H.L.Oldie |
|
|