У меня есть функция суммы цифр, которая вычисляет сумму квадратных цифр и функцию остановки, которая проверяет, всегда ли ряд суммы цифр достигает одного из чисел остановки. {0 1 4 16 20 37 42 58 89 145}

Как сделать функцию с именем s_series, которая возвращает список, содержащий сумму цифр, пока не будет достигнут стоп-номер.

ex :- (s_series 130)
 (10 1)

Мой код

    (define (s_series x)
    (let ((number (sum-of-digits x)))
(if (number stop(number) 1)
     ((let (L '(sum)))
      (s_series sum ))
      L
     ))

Как я могу это исправить и заставить это работать?

0
user7630822 22 Мар 2017 в 22:49

2 ответа

Лучший ответ

Рекомендуемый подход, конечно, заключается в использовании существующих процедур (таких как unfold) для решения вашей проблемы. Это способ мышления, поддерживаемый функциональным программированием. Для полноты картины давайте посмотрим, как мы могли бы написать эквивалентное решение, используя только основные операции, и процедуры, которые мы ранее определили:

(define (s_series n)
  (let ((sum (sum-of-digits n)))
    (if (stop? n)
        (list sum)
        (cons sum (s_series sum)))))

Работает как положено:

(s_series 120)
=> '(5 25 29 85 89)
0
Community 23 Май 2017 в 11:54

Прежде всего, если вы собираете sum-of-squared-digits, то функция stop? должна взять такую сумму, а не вычислять ее напрямую:

(define (stop? value)
  (if (memv value '(0 1 4 16 20 37 42 58 89 145)) #t #f))

Обратите внимание, что я использую memv, так как мы знаем, что сравниваем числа, а memv использует eqv? для сравнения и, таким образом, является правильной функцией-членом для задания. Также я не использую sum-of-squared-digits здесь, чтобы не выполнять операцию дважды для каждого элемента.

В библиотеке списков SRFI-1 есть функция с именем unfold:

(require srfi/1) ; In #!r6rs you import (srfi :1) but I assume #lang racket

(define (s-series start)
  (unfold stop?                         ; stop if the sum is accodring to stop?
          values                        ; no term transformation
          sum-of-squared-digits         ; how to make th enext value
          (sum-of-squared-digits start) ; omit the first value 
          (lambda (v) (list v))))       ; keep the stop value

(s-series 120)
; ==> (5 25 29 85 89)
1
Sylwester 22 Мар 2017 в 21:05