Факторизация на HomeLisp

Узнай цену своей работы

Формулировка задачи:

Прошу указать на ошибки и указать, как их можно исправить. Разбираюсь с homelisp, нужно сделать факторизацию числа, то есть разбить на множители. Пытался перенести код(рабочий 100%) с++ на lisp, ниже два кода, лисп и си. Ошибка в программе на лиспе:
Неожиданный конец списка. Последнее выражение: (DO NIL ((<= i (SQR n))) (IF (= 0 (REMAINDER (%) n i)) (= n n/i) (PRINTLINE n) (PRINTS "* ") (+ i 1))) Глубина вызова EVAL: 18 ==> ERRSTATE
Листинг программы
  1. (defun p (n)
  2. (setq i 2);;объявление переменной
  3. (do (
  4. ;; задание нач. значений и форм приращений, пусто
  5. )
  6. (
  7. (<= i (sqr n));;условие остановки цикла
  8. )
  9. (if (= 0 (remainder(%) n i)) ;; Истино - если не Nil
  10. (= n n/i)(printline n) (prints "* ") ;; если да, то выводим n
  11. (+ i 1) ;; если нет, то плюсуем и заново
  12. )
  13. )
  14. )
Листинг программы
  1. // factorialization.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include <stdio.h>
  5. #include <math.h>
  6. #include <conio.h>
  7.  
  8. int _tmain(int argc, _TCHAR* argv[])
  9. {
  10. double n, i;
  11. scanf_s("%lf", &n);
  12. i = 2;
  13. while (i <= (sqrt(n)))
  14. if ((int)n % (int)i == 0) {
  15. printf_s("%.0lf*", i);
  16. n = n / i;
  17. }
  18. else
  19. i = i + 1;
  20. printf_s("%.0lf", n);
  21. _getch();
  22. return 0;
  23. }
Переделал тот код, сделал бесконечный цикл, но проблема теперь во вложенном if, как я понимаю. Не могу понять как верно разделить их, как корректно задать значения в true и false.
Листинг программы
  1. (defun p (n)
  2. (setq i 2)
  3. (loop (if(<= i (sqr n))
  4. (if (zerop(remainder n i)) ((= n n/i)(print n)(prints "* ")) (add1 i))
  5. (return 'ok))
  6. )
  7. )

Решение задачи: «Факторизация на HomeLisp»

textual
Листинг программы
  1. (defun factorize (n)
  2.       (let ((res nil))
  3.           (do ((i 2 (+ i 1)))
  4.                  ((> i (/ n 2)) (reverse res))
  5.                  (when (zerop (% n i)) (push i res)))))
  6.  
  7. ==> factorize
  8.  
  9. (factorize 10)
  10.  
  11. ==> (2 5)

Объяснение кода листинга программы

В данном коде представлена функция factorize, которая принимает целочисленный аргумент n и возвращает список простых чисел, которые являются делителями n. Внутри функции используется блок let, который определяет две переменные: res и i. Переменная res инициализируется значением nil, а переменная i инициализируется значением 2. Далее следует цикл do, который выполняется до тех пор, пока значение переменной i не станет больше n/2. В каждой итерации цикла значение переменной i увеличивается на 1. Внутри цикла do находится условие when, которое проверяет, является ли n/i равным нулю. Если это так, то число i добавляется в конец списка res с помощью функции push. После завершения цикла do, результат функции factorize возвращается в обратном порядке с помощью функции reverse. Таким образом, при вызове функции factorize с аргументом 10, она вернет список простых чисел (2 5).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы