проблема с рекурсией

GEN2009

Новичок
проблема с рекурсией

PHP:
// Функция проверки существования файла с именем $name в директории $dir и
// рекурсивного поика подходящего имени, возвращает строку - подходящее имя
function isset_file_name($name,$dir,$k = 0){
	$name = str_replace(' ','_',$name);
	if($k > 0){
		$ar = explode('.',$name);
		if(count($ar) == 1) $name .= $k;
		else{
			$ar[count($ar)-2] .= $k;
			$name = implode('.',$ar);
			}
		}
	if(!file_exists($dir . $name)) return $name;
	elseif(file_exists($dir . $name)) isset_file_name($name,$dir,$k++);
	}
// этот файл там есть(хотя если е нет результат тот же)
print isset_file_name('down 1.2.jpg','user_files/');
фаерфокс выдает:
Соединение было сброшено...

В чем проблема никак не пойму, вроде зацикливания нигде нет?
 

Фанат

oncle terrible
Команда форума
"вроде?" ты гадалка или программист? возьми, да проверь!
 

GEN2009

Новичок
Дак я же говорю что очевидно зацикливается, но непойму где именно и почему!
 

GEN2009

Новичок
Подсказку где я ошибаюсь, или тут уже перестали помогать искать ошибки в коде!?

-~{}~ 09.04.07 21:46:

Да можете элементарно у себя посмотреть-код же я написал...
 

gonza

Новичок
Re: проблема с рекурсией

Автор оригинала: GEN2009
PHP:
		else{
			??? $ar[count($ar)-2] .= $k; ???
			$name = implode('.',$ar);
			}
Этим что хотел сказать?

Автор оригинала: GEN2009
возвращает строку - подходящее имя
Твое понимание подходящего имени?

PS. есть мнение что рекурсивные функции также поддаются отладке...
 

bgm

 
Re: проблема с рекурсией

GEN2009
PHP:
	if(!file_exists($dir . $name)) return $name;
	elseif(file_exists($dir . $name)) isset_file_name($name,$dir,$k++);
В чем проблема никак не пойму, вроде зацикливания нигде нет?
Невооружённым взглядом видно, что в случае существования файла происходит именно, что зацикливание.
Такое понятие как отладка незнакомо?
 

Фанат

oncle terrible
Команда форума
или тут уже перестали помогать искать ошибки в коде!?
помогать не перестали.
а искать за ленивых программеров их ощибки - такого тут никогда и не было
 

GEN2009

Новичок
else{
??? $ar[count($ar)-2] .= $k; ???
$name = implode('.',$ar);
}
это конкотенация числа и предпоследнего элемента в разбитого по точкам имени, например если есть name.name.n и name.name1.n то для добавления еще раз name.name.n он будет добавлен как
name.name2.n


if(!file_exists($dir . $name)) return $name;
elseif(file_exists($dir . $name)) isset_file_name($name,$dir,$k++);
это означает, если такое имя существует, то вызвать функцию подбора снова, выход из рекурсии задуман в
if(!file_exists($dir . $name)) return $name;
(которая идет перед возможным вызовом рекурсии)
 

Фанат

oncle terrible
Команда форума
а что значит "подходящее имя"?
И зачем нужна рекурсия для его поиска? чем обычный цикл не устраивает?
 

gonza

Новичок
Давай отвлечемся и поговорим на великом и могучем. Что конкретно ты ищешь?
 

GEN2009

Новичок
Автор оригинала: Фанат
а что значит "подходящее имя"?
И зачем нужна рекурсия для его поиска? чем обычный цикл не устраивает?
зачем нужна
Во-первых хочу с ней потренироваться(т.к. редко использую можно сказать вообще не использую)

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

bgm

 
GEN2009
Ну нет у тебя там выхода из рекурсии в том случае, если файл существует!
Конкретизирую точку поиска:
PHP:
isset_file_name($name,$dir,$k++);
Подумай, чему у тебя будет равняться $k при втором вызове функции?

P.S. Максимально полное сохранение имени файла возможно без всякого подбора, рекурсий и прочая.
 

GEN2009

Новичок
Подумай, чему у тебя будет равняться $k при втором вызове функции?
думаю-будет равняться 2! тк параметр $k при первом запуске по умолчанию и приравнивается 0 при вызове
isset_file_name($name,$dir,$k++);
он становится 1 и т.д.

На вопросы ты не отвечаешь тоже из принципа?
- а что я непонятно сказал!? я же все уже рассказал, что непонятного то!?
 

Vallar_ultra

Любитель выпить :)
bgm
Эх, человек не понимает чем отличается ++$i от $i++, а вы ему это....

GEN2009
Весна блин пришла..... Рекомендую подумать сначала прежед чем распинаться о своей правоте.... а еще лучше: http://php.net
 

GEN2009

Новичок
спасибо, вот в чем дело, то, не знал до этого о существовании
пре - инкремента...
 
Сверху