LINUX.ORG.RU

Странное поведение кода DrRacket

 


0

3

Здесь код в котором не могу сообразить

#lang racket
(define sum-of-first
  (lambda (n)
    (if (= n 1)
        1
        (+ (sum-of-first (- n 1))
           n))))

например, ввожу, в debugger
(sum-of-first 4)
работает только эта часть
(sum-of-first (- n 1))
полученный результат складывается в stack, в данном случае это
4
3
2
1 и вот здесь я поплыл т.к. в этом месте
(if (= n 1)
        1
код должен вылететь, а он нет, он начинает отрабатывать сумму
(+ (sum-of-first (- n 1))
           n)

Как это понять?

Вижу, что въехать в рекурсию не могу, на emacs то же самое, только debugger отсутствует

Пример из Concrete abstraction



Последнее исправление: saufesma (всего исправлений: 1)

Все там нормально, доходит до n=1 и складывает все что в стеке сохранилось.

CL-USER> (sum-of-first 4)
  0: (SUM-OF-FIRST 4)
    1: (SUM-OF-FIRST 3)
      2: (SUM-OF-FIRST 2)
        3: (SUM-OF-FIRST 1)
        3: SUM-OF-FIRST returned 1
      2: SUM-OF-FIRST returned 3
    1: SUM-OF-FIRST returned 6
  0: SUM-OF-FIRST returned 10
10

poe
()

Или просто на бумажке подставь, что и за чем вычисляется.

(sum-of-first 4)
(+ (sum-of-first 3) 4)
(+ (+ (sum-of-first 2) 3) 4)
(+ (+ (+ (sum-of-first 1) 2) 3) 4)
(+ (+ (+ 1 2) 3) 4)
(+ (+ 3 3) 4)
(+ 6 4)
10

JaneDoe
()
Ответ на: комментарий от poe

Все там нормально, доходит до n=1 и складывает все что в стеке сохранилось.

Там же никакого вызова нет, просто сообразить никак.

saufesma
() автор топика
Ответ на: комментарий от poe

Там же кнопка download есть.

Несколько десятков раз нажимал, тишина.

saufesma
() автор топика
Ответ на: комментарий от poe

Я тут погулял и пришёл к такому объяснеию. Когда я вызываю функцию

(sum-of-first 4 )

код пробегает через

if

и выполняет эту часть, сначала вызывает функцию +

(+ (sum-of-first (- n 1)) n)

n присваивается 4, потом выполняется

(sum-of-first (- n 1))

она выполняется рекурсивно, наполняет стек, как только (sum-of-first (- n 1)) возвращает 1, вызывается функция + т.е.

(+ 4 3 2 1)

вот и результат

10

правда птичьим языком написал.

saufesma
() автор топика
Ответ на: комментарий от anonymous

Пытаюсь скачать cclive а он мне

Checking ... ...... ....... libquvi: error: /usr/share/libquvi-scripts/lua/website/youtube.lua:152: no match: media title

не подскажешь, что сделать, чтобы скачать

saufesma
() автор топика

Так обычная же рекурсия. Просто когда доходит до 1, то уже без рекурсии возвращается и всё вычисление схлопывается.

turtle_bazon ★★★★★
()
Ответ на: комментарий от saufesma

Я эту литературу читал и поэтому у меня бы вопросов как в стартовом сообщении не возникло бы. Ты же, судя по твоим вопросам, эту литературу не читал, но заявляешь:

В оригинале такую литературу читать проще.

Странно.

ados ★★★★★
()
Ответ на: комментарий от ados

Читал 10 лет назад, сейчас где-то в гараже валяется.

Сейчас на перепутье и вроде нужно уровень программирования поднять выше, так сказать, а вроде и времени не хватает. Книжка Concrete Abstraction, примеры там подобраны хитроватые, вот попался. Оно вроде надо, а вроде и нет. Просто ставить задачу и работать над ней, конечно проще чем читать чужие книжки.

Хотелось бы совместить машиностроение с программированием но ...

saufesma
() автор топика
Ответ на: комментарий от xerx

Это ты ещё до продолжений не дошёл, вот там действительно сложно въехать

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

saufesma
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.