Факторизация на 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
(defun p (n)
(setq i 2);;объявление переменной
 
 (do (
        ;; задание нач. значений и форм приращений, пусто
     )
     (
       (<= i (sqr n));;условие остановки цикла
     )
           
       (if (= 0 (remainder(%) n i))  ;; Истино - если не Nil
             (= n n/i)(printline n) (prints "* ")     ;; если да, то выводим n
             (+ i 1)    ;; если нет, то плюсуем и заново
       )    
  )
)
// factorialization.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#include <conio.h>

int _tmain(int argc, _TCHAR* argv[])
{
    double n, i;
    scanf_s("%lf", &n);
    i = 2;
    while (i <= (sqrt(n)))
    if ((int)n % (int)i == 0) {
        printf_s("%.0lf*", i);
        n = n / i;
    }
    else
        i = i + 1;
    printf_s("%.0lf", n);
    _getch();
    return 0;
    
}
Переделал тот код, сделал бесконечный цикл, но проблема теперь во вложенном if, как я понимаю. Не могу понять как верно разделить их, как корректно задать значения в true и false.
(defun p (n)
     
      (setq i 2)
      
 (loop (if(<= i (sqr n)) 
             (if (zerop(remainder n i)) ((= n n/i)(print n)(prints "* ")) (add1 i))   
             (return 'ok))
 )
)

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

textual
Листинг программы
(defun factorize (n)
      (let ((res nil))
          (do ((i 2 (+ i 1)))
                 ((> i (/ n 2)) (reverse res))
                 (when (zerop (% n i)) (push i res)))))
 
==> factorize
 
(factorize 10)
 
==> (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
Похожие ответы