меняет символы в строке местами

rotoZOOM

ACM maniac
Deserved Ок, не будем дальше флудить. Я просто хотел сказать, что твоя реализация мягко говоря не лучшее решение поставленной задачи и может сбить с пути истинного студентега.
Ферштейн?
 

Deserved

Новичок
Да я эта панимаю :)

Я вот тут такое придумал:

PHP:
  function rec($string)
  {
    if($string != strrev($string))
    {
        $trah = strrev($string);
        rec($trah);
    }
              
      return $string;
  }
Толька не знаю почему не работает :/
 

zerkms

TDD infected
Команда форума
if($string != strrev($string))

это что?

попробуй "поработать" интерпретатором и пошагово ручками выполнить на бумажке свою функцию
 

Sluggard

Новичок
Deserved
Ну и раз пошла такая пьянка, то это тебе зачем?
PHP:
$trah = strrev($string);
и где ты используешь результат от?
PHP:
rec($trah);
Какова глубина твоей рекурсивной ф-и, при strlen($string) > 2? Доугими словами, когда у тебя не выполнится условие?
PHP:
if($string != strrev($string))
при том что в rec() ты передаешь только strrev($string)?
Зачем все те монипуляции, если твоя функция возвращать может только неизмененный $string?
PHP:
return $string;
Из четырех строк кода нет ни одной осмысленной. Воздержался бы ты пока от того, чтобы давать советы. Лучше перечитай словестный алгоритм, который привел rotoZOOM. Авось и сам чему-то научишься.
 

Deserved

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

-~{}~ 21.04.08 17:33:

ну вот пакушал и вернулась бошка в полунормальное состояние, извините работаю и всё делаю на лету, так что понимаю что всё выглядет бредом.

Sluggard
Алгоритм rotoZOOM я понял:

Слово ПРЕДЛОГ

Последняя буква: Г
Перевёрнутая середина без последней буквы: ОЛДЕР
Первая буква: П

= ГОЛДЕРП

Я обещаю что предъявлю код слегка попоже когда время будет, но счас вернёмся к моей ТУПОЙ задаче:

Всё что я хотел сделать эта рекрусию используя strrev() т.е.

Вызвать функцию
PHP:
function rec($string)
где переменная $string наше слово дапустим:

PHP:
$string = KOPOBA;
Потом я делаю проверку:

PHP:
if($string != strrev($string)) 
{
        $trah = strrev($string); 
        return rec($trah); 
}
Где говорится если КОРОВА не равно АВОРОК тогда переменной $trah присваеваим strrev($string) т.е. $trah = АВОРОК.

И тогда снова вызываем функцию нашу (делаем рекрусию), со словом АВОРОК.

И именно на этом моменте, я ругаю себя за не внимательность, и панимаю что ненадо гнаться за двумя и более зайцами (в моём случае работать и умничить на форуме). Т.к. теперь переменная $string = АВОРОК опять проходит через проверку
PHP:
if($string != strrev($string))
где говорится если АВОРОК не равен КОРОВА то....

Вообще бесконечная рекрусия. Как будет время я исправлю свою функцию и напишу функцию rotoZOOM обучения ради.

Спосибо всем кто помогал.
 

cDLEON

Онанист РНРСlub
Помоему ты не правильно понял.
Ты должен будешь последовательно менять местами две крайние буквы. И если буква осталась одна - отдавать её без изменений.
Естественно всё это дело в рекурсии.
 

Dl

Новичок
По-моему проще проверять на пустоту передаваемой строки и отнимать от нее последнюю букву.
 

Sluggard

Новичок
rotoZOOM
Да. В твоем варианте тоже. Только глубина в два раза меньше. По идее на коппейку быстрее должна быть.
 

antson

Новичок
Партнер клуба
Dl
return !empty($x)?substr($x,-1).revert(substr($x,0,strlen($x)-1)):'';
чтото такое ?

самое ужасное решение для обращения строки. такое кроме как в лабах юзать нельзя.

не спасет дажа передача по ссылке.

ближе всего к идеалу цикл до половины строки с обменом
значений байтов . а рекурсия в два раза больше шагов и накладные жуткие.

рекурсивные алгоритмы для этой задачи неподходят
 

Sluggard

Новичок
PHP:
empty($x) ... ''
:)
PHP:
substr($x,0,strlen($x)-1)
:)
PHP:
substr($x,-1).revert(substr($x,0,strlen($x)-1))
:)
Угу. Что-то типа. :)
 

antson

Новичок
Партнер клуба
rotoZOOM
да понял я что лаба написать аналог strrev()
ABC в CBA

топик стартер кинул вариант с ошибкой ему
до рабочего варанта нужно было только
$x= $param[strlen($param)-1];
$newparam = substr($param, 0, strlen($param)-1);
$y= reverse($newparam);
return $x.$y;

а он в первую строку ретурн загнал.

деверс
function rec($string, &$ic)
{
$len = strlen($string);

if($len != 0)
{
$string[$len-1]; // на фига
$ic .= $string[$len-1];
for($i=0;$i<=$len-2; $i++) // этот цикл хуже чем substr
{
$st.=$string[$i];
}
return rec($st,$ic);
}
return $ic;
}


а теперь почему я написал что это все плохо.
оперативка не резиновая . реальный текст на пару килобайт так не развернеш.

так что топик стартеру сгодиться любое решение в котором отражена суть рекурсии (вызов тотже функции если не наступило граничное условие для формирования нужного результата)

цикл for(старт,условие,приращение) тоже можно свести к
рекурсии
rekur(тек){
if(!условие){
rekur(тек+приращение);
}

но тащить через стек кучу параметров . брррррр
 

Dl

Новичок
Автор оригинала: antson
Dl
return !empty($x)?substr($x,-1).revert(substr($x,0,strlen($x)-1)):'';
чтото такое ?

самое ужасное решение для обращения строки. такое кроме как в лабах юзать нельзя.
Ну, не для лаб есть стандартные функции:)
Можно и с передачей по ссылке:
PHP:
function str_reverse($string, &$result = '') {
	if (!empty($string)) {
		$result .= $string[strlen($string) - 1];
		str_reverse(substr($string, 0, -1), $result);
	}
	return $result;
}
 
Сверху