Nano Hash - криптовалюты, майнинг, программирование

Схема консольной печати

Только начал со Схемы. У меня проблема с печатью на консоли. Простой пример печати списка:

 (define factorial
   (lambda (n)
     (cond 
       ((= 0 n) 1)
       (#t (* n (factorial (- n 1)))))))

Я хочу печатать n каждый раз, когда вызывается функция. Я понял, что я не могу сделать это в той же функции? Нужно ли мне вызывать другую функцию, чтобы я мог печатать?

11.02.2012

Ответы:


1

Печать в Scheme работает по вызову display (и, возможно, newline). Поскольку вы хотите вызывать его последовательно до/после чего-то еще (что в функциональном (или, в случае Scheme, функциональном) языке имеет смысл только для побочных эффектов вызываемых функций), вам обычно нужно использовать begin , который по очереди оценивает свои аргументы, а затем возвращает значение последнего подвыражения. Однако lambda неявно содержит такое begin-выражение.

Итак, в вашем случае это будет выглядеть так:

 (lambda (n)
   (display n) (newline)
   (cond [...]))

Два замечания:

  1. Вы можете использовать (define (factorial n) [...]) в качестве сокращения для (define factorial (lambda (n) [...])).
  2. Способ реализации factorial запрещает оптимизацию хвостового вызова, поэтому программа будет использовать немного места в стеке для больших значений n. Однако переписать его в оптимизируемую форму с помощью аккумулятора возможно.

Если вы хотите напечатать n только один раз, когда пользователь вызывает функцию, вам действительно нужно написать обертку, например:

 (define (factorial n)
   (display n) (newline)
   (inner-factorial n))

А затем переименуйте свою функцию в inner-factorial.

11.02.2012
  • Вам не нужно начинать в теле лямбда. 11.02.2012
  • О спасибо! Но как насчет печати после условия? На самом деле я не работаю над факториалом, но с ним проще объяснить. Что-то вроде печати, только если условие истинно, т.е. печати, если n!=0. 11.02.2012
  • Я исправил часть про begin. Тело предложения cond может также содержать несколько выражений, так что вы можете просто вызвать там display. 11.02.2012
  • Сорри, если я не ясно выразился. Я имею в виду, что если n=5, я бы напечатал 1 2 3 4 5 11.02.2012
  • Я предполагаю, что вы все еще хотите расширить factorial для этого? Тогда это будет выглядеть так: (define factorial (lambda (n) (cond ((= 0 n) 1) (#t (let ((result (* n (factorial (- n 1))))) (display n) (newline) result))))) 11.02.2012
  • большое спасибо! Можете ли вы сказать мне, почему вам нужно создать переменную? почему это не работает с (отобразить n) (новая строка) (* n (факториал (- n 1))) 11.02.2012
  • Это также будет работать, но приведет к другому эффекту: поскольку текущий n теперь печатается перед рекурсивным вызовом, вывод будет обратным. 11.02.2012
  • Хм.. не получилось. применение процедуры: ожидаемая процедура, учитывая: #‹void›; аргументы были: #‹void› 1.. Ах, я не получаю эти сообщения об ошибках. 11.02.2012
  • Немного отклонившись от исходного вопроса, рекомендую задать отдельный. 11.02.2012
  • В исходном ответе было несколько опечаток. Я попытался отредактировать ответ, чтобы он был правильным. например (define factorial (n) ...) синтаксически неверно: должно быть (define (factorial n) ...). 11.02.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..