Все списки схем создаются от начала до конца.Сначала вы хотите создать ("XXXX")
, затем ("XXX" "XXXX")
и т. Д. Всякий раз, когда вы делаете (cons "X" (recursion ....))
, тогда (recursion ...)
необходимо закончить до cons
, тогда как наиболее эффективным является использование аккумулятора.При использовании append
каждый шаг пахнет неправильно, поскольку append
- это O (n), поэтому, если вы делаете это на каждом шаге, то у вас есть O (n ^ 2).С парой тысяч элементов вы начнете замечать разницу.
Вам не нужен create-list
, который создает не список, а строку, поскольку в Scheme есть make-string
, который делает то, что вы хотите:
(make-string 3 #\X) ; ==> "XXX"
Итак, вотлестница:
(define (stair n)
(define (xs n)
(make-string n #\X))
(let helper ((n n) (acc '()))
(if (zero? n)
acc
(helper (- n 1)
(cons (xs n) acc)))))
Так что в этом случае, если бы вы хотели получить ее в обратном порядке, вы бы использовали другое имя, отличное от n
, и пошли вверх, пока это не будет пройдено и n
.Иногда у вас нет выбора, например, если вы скопировали список, то часто вы можете создать обратное, а затем отменить результат.Иногда вам нужно использовать память и требовать продолжения, но это ограничит, насколько глубокими могут быть ваши структуры, прежде чем программа перестанет работать.В случае с ракетками это не останавливается, пока вы не исчерпали всю память кучи, которую вы предоставили.