Написание функции, которая находит наименьшее k такое, что разница между x и функцией - PullRequest
0 голосов
/ 15 сентября 2018

У меня проблемы с тем, что мой код кажется неполным и явно неправильным.Для моей функции (terms-needed x tol) я должен найти наименьшее k такое, чтобы разница между x и (square (babylonian x k)) была меньше tol (допуск).Другими словами, мы должны измерить, насколько большим должен быть k в функции (babylonian x k), чтобы обеспечить хорошее приближение квадратного корня.

На данный момент я получаю сообщение об ошибке приложения: не процедура; "с моим кодом

(define (square x)
  (* x x))

(define (first-value-k-or-higher x tol k)
  (if (<= (x)
         (square (babylonian x k)) tol)
      k)
      (first-value-k-or-higher x tol (+ k 1))
  )


(define (terms-needed x tol)
  (first-value-k-or-higher x tol 1))

Мы должны использовать вспомогательную функцию (first-value-k-or-higher x tol k), которая оценивается в k, если (square (bablyonian x k)) находится в пределах tol аргумента x, в противном случае вызывает себя рекурсивнос большим k.

Это функция, которая необходима для работы (terms-needed x tol):

  (define (babylonian x k)
    (if (>= x 1)
      (if (= k 0)
          (/ x 2)
          (* (/ 1 2) (+ (expt x (/ 1 2)) (/ x (expt x (/ 1 2))))))
      1)
  )

. Здесь приведен полный текст, предоставляющий полный контекст о том, какой должна быть проблема.

Теперь мы измерим, сколько должно быть k в вышеуказанной функции, чтобы обеспечить хорошее приближение квадратного корня.Вы напишете функцию SCHEME (terms-needed x tol), которая будет оценивать число членов в бесконечной сумме, которое должно быть в пределах tol, то есть наименьшее k, такое, чтобы разница между x и (square (babylonian x k)) составляламенее чем tol.Замечание 2. На первый взгляд, проблема определения (terms-needed x tol) выглядит немного сложной, потому что совсем не очевидно, как выразить ее в терминах меньшей задачи.Но вы можете написать вспомогательную функцию (first-value-k-or-higher x tol k), которая оценивается в k, если (square (bablyonian x k)) находится в пределах tol от аргумента x, в противном случае рекурсивно вызывает себя с большим k.

1 Ответ

0 голосов
/ 15 сентября 2018

У вас есть несколько проблем.

Во-первых, у вас есть круглые скобки вокруг x в

 (if (<= (x)

Это вызывает ошибку, которую вы видите, потому что она пытается вызвать функцию с именемx, но x называет число, а не функцию.

Во-вторых, вы не вычисляете разницу между x и (square (babylonian x k)).Вместо этого вы дали 3 аргумента <=.

В-третьих, вы не делаете рекурсивный вызов, когда сравнение не удается.Он находится за пределами if, поэтому он выполняется постоянно (если вы используете функцию автоматического отступа редактора, вы могли заметить эту проблему самостоятельно).

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

(define (first-value-k-or-higher x tol k)
  (if (<= (abs (- x (square (babylonian x k)))) 
          tol)
      k
      (first-value-k-or-higher x tol (+ k 1))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...