Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2012, 20:34   #1
NiMdis
Новичок
Джуниор
 
Регистрация: 22.01.2012
Сообщений: 3
По умолчанию Program stack oveflow (Lisp)

Задание : найти заданное количество простых чисел (начиная от 2)

Решение :
Код:
(defun issimple (a b)
	(cond
		((> b (/ a 2)) T)
		((eq (mod a b) 0) Nil)
		(T (issimple a (+ b 1)))
	)
)

(defun subf (a b)
	(cond
		((eq a 0) Nil)
		((issimple b 2) (cons b (subf (- a 1) (+ b 1))))
		(T (subf a (+ b 1)))
	)
)

(defun fun (a)
	(subf a 2)
)
Проблема: программа отлично работает до ввода количества простых чисел = 341, если ввести больше ,то происходит Program stack oveflow
Помогите пожалуйста исправить данную ошибку, чтобы можно было вводить количество простых чисел 1000+

Пример ошибки :

NiMdis вне форума Ответить с цитированием
Старый 22.01.2012, 22:50   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Нужно переписать проверку в итеративном виде, вместо рекурсивного, тогда не будет проблем с нехваткой стека

Код:
(defun prime? (n)
  (loop for i from 2 to (/ n 2) do
    (if (= (mod n i) 0)
      (return-from prime? NIL)))
  T)

(defun find-n-primes (n)
  (labels ((next-prime (current)
               (loop for i from (1+ current) do
                 (if (prime? i)
                   (return i)))))
    (let ((current-prime 2))
      (dotimes (i n)
        (print current-prime)
        (setf current-prime (next-prime current-prime))))))

Последний раз редактировалось netrino; 22.01.2012 в 23:01. Причина: исправил find-n-primes
netrino вне форума Ответить с цитированием
Старый 23.01.2012, 00:12   #3
NiMdis
Новичок
Джуниор
 
Регистрация: 22.01.2012
Сообщений: 3
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Нужно переписать проверку в итеративном виде, вместо рекурсивного, тогда не будет проблем с нехваткой стека
мм извиняюсь за наитупейший вопрос (просто совсем новичек в лиспе) а как результат то увидеть (что в командой строке вбивать какую функцию)
н
NiMdis вне форума Ответить с цитированием
Старый 23.01.2012, 00:32   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Код:
(find-n-primes 1000)
1000 - кол-во простых чисел, которое будет выведено на экран. Я надеюсь, сможете сами изменить, чтобы ф-ция возвращала список, а не выводила значения сразу же?
netrino вне форума Ответить с цитированием
Старый 23.01.2012, 00:38   #5
NiMdis
Новичок
Джуниор
 
Регистрация: 22.01.2012
Сообщений: 3
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Код:
(find-n-primes 1000)
1000 - кол-во простых чисел, которое будет выведено на экран. Я надеюсь, сможете сами изменить, чтобы ф-ция возвращала список, а не выводила значения сразу же?
попытаюсь огромное вам спасибо
NiMdis вне форума Ответить с цитированием
Старый 23.01.2012, 00:58   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Не стоит благодарности
netrino вне форума Ответить с цитированием
Старый 23.01.2012, 09:38   #7
arrowsf1
Пользователь
 
Аватар для arrowsf1
 
Регистрация: 22.01.2012
Сообщений: 97
По умолчанию

Чё на лекции делал то
Модераторам: не баньте, у мя такие полезные советы, они стоющие
arrowsf1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
'C:\Program Files\Borland\Delphi\Bin\delphi32.$ $$' to 'C:\Program Files\Borland\Delphi\Bin\delphi32.d ro' tonatas Общие вопросы Delphi 2 21.09.2010 08:26
Нelp write a program Alexxx92 Помощь студентам 0 04.06.2009 17:05
Install (Update program) MAcK Общие вопросы .NET 0 23.10.2008 11:00