Вот пример рекурсивного алгоритма для обращения к односвязному списку. На ноутбуке со следующей спецификацией (память 4G, процессор Intel Core i5 2.3GHz, 64-разрядная версия Windows 7) эта функция будет запущена с ошибкой StackOverflow для связанного списка размером около 10 000.
Могу сказать, что мы должны использовать рекурсию разумно, всегда принимая во внимание масштаб системы. Часто рекурсия может быть преобразована в итеративную программу, которая масштабируется лучше. (Одна итеративная версия того же алгоритма приведена в нижней части страницы, она меняет один и тот же список размером 1 миллион за 9 миллисекунд.)
private static LinkedListNode doReverseRecursively(LinkedListNode x, LinkedListNode first){
LinkedListNode second = first.next;
first.next = x;
if(second != null){
return doReverseRecursively(first, second);
}else{
return first;
}
}
public static LinkedListNode reverseRecursively(LinkedListNode head){
return doReverseRecursively(null, head);
}
Итеративная версия того же алгоритма:
public static LinkedListNode reverseIteratively(LinkedListNode head){
return doReverseIteratively(null, head);
}
private static LinkedListNode doReverseIteratively(LinkedListNode x, LinkedListNode first) {
while (first != null) {
LinkedListNode second = first.next;
first.next = x;
x = first;
if (second == null) {
break;
} else {
first = second;
}
}
return first;
}
public static LinkedListNode reverseIteratively(LinkedListNode head){
return doReverseIteratively(null, head);
}
можно всегда метать икру от tr
LOWER_VAR = `echo $(VAR) | tr A-Z a-z`
или
LOWER_VAR = $(shell echo $(VAR) | tr A-Z a-z)
функции 'lc', которые Вы пытающийся звонить от , GNU Делает Стандартную Библиотеку
Принятие, которое установлено, правильный синтаксис был бы
LOWER_VAR = $(call lc,$(VAR))
Можно сделать, это непосредственно в gmake, не используя GNU Делает Стандартную Библиотеку:
lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$1))))))))))))))))))))))))))
VAR = MixedCaseText
LOWER_VAR = $(call lc,$(VAR))
all:
@echo $(VAR)
@echo $(LOWER_VAR)
Это выглядит немного неуклюжим, но это сделало задание.
, Если Вы действительно идете с $ (оболочка) разнообразие, используйте :=
вместо всего =
, как в LOWER_VAR := $(shell echo $VAR | tr A-Z a-z)
. Тем путем Вы только вызываете оболочку одно время, когда переменная объявляется вместо каждого раза, когда на переменную ссылаются!
Hope, которая помогает.