Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Цикл на лиспе. Простая задача 
:(
    Опции темы
ldsdilim
Дата 22.12.2009, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 22.3.2007

Репутация: нет
Всего: нет



Доброго времени суток.
Нужно решить задачу на лиспе. Задание простейшее: найти степень числа. Задание хоть и простое, но решить не получается(я всегда кодил и продолжаю кодить на Си). После нескольких часов мучений сделал рекурсией, но все равно лабу не приняли:
Код

setq chislo 5
setq step 3
setq copystep 1

(defun stepen(x)
    (cond
    ((= step copystep) (princ "Result = ") chislo)
    (t (setq copystep (+ copystep 1)) (setq chislo (* chislo chislo)) (stepen x))    
    )


Сказали нужно циклом while делать. Кто кодит на лиспе, помогите. Нервов уже на эти скобки не хватает.
PM MAIL   Вверх
VH_
Дата 22.12.2009, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 182
Регистрация: 31.10.2006

Репутация: 10
Всего: 11



В Common Lisp формы (while) нет. Сообщите, пожалуйста, какой диалект LISPа Вам приходится использовать.
Рекурсивная функция <для натурального показателя> может выглядеть так:
Код
(defun СТЕПЕНЬ (Число Показатель)
 (cond
  ((zerop Показатель) 1)
  (T (* (СТЕПЕНЬ Число (1- Показатель)) Число))))

Вызов функции СТЕПЕНЬ с аргументами возвращает результат - данное число в степени с данным показателем.
Предположим, что форма (while) функционирует как в AutoLISP:
Код
(defun СТЕПЕНЬ (Число Показатель / результат)
 (setq результат 1)
 (while (> Показатель 0)
  (setq Показатель (1- Показатель))
  (setq результат (* результат Число))))

PM MAIL   Вверх
ldsdilim
Дата 22.12.2009, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 22.3.2007

Репутация: нет
Всего: нет



Делаю на LispWorks, версия языка - Common Lisp, больше ничего нет. В Common Lisp'е есть конструкция loop или forech? Можно сделать любым аналогом while, лишь бы цикл был, а не рекурсия.



PM MAIL   Вверх
VH_
Дата 22.12.2009, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 182
Регистрация: 31.10.2006

Репутация: 10
Всего: 11



Хювёнен-Сеппянен "Мир Лиспа" т.1:
Код
(defun СТЕПЕНЬ (Число Показатель) ; в оригинале EXPT1
 (do
  ((результат 1))
  ((zerop Показатель) результат)
  (setq результат (* результат Число))
  (setq Число (1- Число))))

PM MAIL   Вверх
ldsdilim
Дата 22.12.2009, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 22.3.2007

Репутация: нет
Всего: нет



CL-USER 1 > (defun СТЕПЕНЬ (Число Показатель)
 (do
  ((результат 1))
  ((zerop Показатель) результат)
  (setq результат (* результат Число))
  (setq Число (1- Число))))
СТЕПЕНЬ

CL-USER 2 > (СТЕПЕНЬ 3 4)

и дальше ничего. Не работает. Как ее запустить пробовал и так - (СТЕПЕНЬ 3 4) и так (СТЕПЕНЬ 3, 4), без скобок. Все равно не работает.
PM MAIL   Вверх
VH_
Дата 22.12.2009, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 182
Регистрация: 31.10.2006

Репутация: 10
Всего: 11



Извините, вкралась опечатка:
Код
(defun СТЕПЕНЬ (Число Показатель) ; в оригинале EXPT1
 (do
  ((результат 1))
  ((zerop Показатель) результат)
  (setq результат (* результат Число))
  (setq Показатель (1- Показатель))))

PM MAIL   Вверх
ldsdilim
Дата 22.12.2009, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 22.3.2007

Репутация: нет
Всего: нет



Большое спасибо. Вы мне очень помогли.
PM MAIL   Вверх
adejneka
Дата 22.12.2009, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 8.7.2005
Где: Москва, Россия

Репутация: 9
Всего: 11



Код
CL-USER> (defun pow (x n)
           (loop for i from 0 to n
                 for res = 1 then (* res x)
                 finally (return res)))
POW
CL-USER> (pow 7 0)
1
CL-USER> (pow 7 1)
7
CL-USER> (pow 7 2)
49
CL-USER> (defun pow (x n)
           (do ((i 0 (1+ i))
                (res 1 (* res x)))
               ((= i n)
                res)))
STYLE-WARNING: redefining POW in DEFUN
POW
CL-USER> (loop for i from 0 to 3 do (format t "~D: ~D~%" i (pow 2 i)))
0: 1
1: 2
2: 4
3: 8
NIL
CL-USER> (defun pow (x n)
           (loop for i = 0 then (1+ i)
                 for r = 1 then (* r x)
                 while (< i n)
                 finally (return r)))
STYLE-WARNING: redefining POW in DEFUN
POW
CL-USER> (defun pow (x n)
           (loop with r = 1
                 for i = 0 then (1+ i)
                 while (< i n)
                 do (setq r (* r x))
                 finally (return r)))
STYLE-WARNING: redefining POW in DEFUN
POW

PM MAIL   Вверх
_sg
Дата 25.4.2014, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 16.5.2007

Репутация: 2
Всего: 2



как вариант:
Код

(defun -expt (m n) (if (= n 1) m (* m (-expt m (1- n)))))

> (-expt 2 3)
8

--------------------
vk.com/ansicommonlisp
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума LISP
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Lisp — это целое семейство языков. Всегда указывайте в теме используемый диалект (Common Lisp, Scheme и т.д.).
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LISP | Следующая тема »


 




[ Время генерации скрипта: 0.0703 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.