Ваш конструктор имеет локальную переменную int[] x
, которая игнорируется в конце конструктора.
Попробуйте:
public class Square{
// initialize to array of ten ints
public int x[] = new int[10];
public Square() {
x[0] = 7;
}
public void root() {
for (int i = 0; i < 10; i++) {
x[i+1] = x[i] - (Math.pow(x[i] - 2.5, 2)) / (2 * (x[i] - 2.5));
System.out.println(x[i + 1]);
}
}
}
Редактировать: int y
является локальным для конструктора, оно также отбрасывается в конце области конструктора.
A let
is a lambda
.
Например,
(let ((x 1))
body)
можно перевести в
((lambda (x) body) 1)
Более того, в Scheme все управляющие и средовые структуры могут быть представлены лямбда-выражениями и приложениями лямбд.
Таким образом, лямбда
является строго более мощной, чем let
, и составляет основу многих интересных конструкций, встречающихся в Scheme.
Что касается define
и lambda
, то define
верхнего уровня добавляет привязку к окружению верхнего уровня.
Когда вы пишете
(define (f x)
body)
вы на самом деле говорите
(define f (lambda (x) body))
Вложенные определения переводятся в letrec
, которые также могут быть переписаны с помощью лямбд.
Итак, повторюсь, многие конструкции Scheme могут быть переведены во что-то с помощью lambda
, и поэтому вам действительно стоит хорошо понимать lambda
.
Вы используете lambda
, если хотите создать функцию, чтобы использовать ее в качестве аргумента другой функции (например, map
), но на самом деле вы не хотите называть функцию.
Например, если вы хотите добавить 42 к каждому номеру в списке, вы можете сделать:
(define (add42 x) (+ x 42))
(map add42 (list 1 2 3 4))
Но если вы не хотите давать имя функции, которую вы используете только на этот раз, вы могли бы просто сделать:
(map (lambda (x) (+ x 42)) (list 1 2 3 4))
В схеме процедура (или функция) - это объект первого класса, такой как список, число или строка. Для создания литерала списка вы используете примитив list
:
> (define marks (list 33 40 56))
> marks
> (33 40 56)
Точно так же, чтобы создать процедуру, вы используете примитив lambda
(или специальную форму):
> (define add-marks (lambda (m) (apply + m)))
> (add-marks marks)
> 129
Поскольку процедуры являются основной формой абстракции, Схема предоставляет ярлык для define
, чтобы упростить привязку новых процедур:
> (define (add-marks m) (apply + m))
Кроме этого, процедуры как и все другие объекты первого класса. Они могут быть переданы в качестве аргументов другим процедурам, и процедура может оценить, чтобы произвести (или вернуть) другую процедуру.
Вы можете думать так ... вы создаете функцию, которая использует другую функцию, но вы хотите сделать ее более модульной, поэтому вы вызываете вторую функцию в качестве аргумента первой, и это оставляет вас возможность изменить секунду, когда вы чувствуете, что вам нужна другая функциональность ... надеюсь, это имеет смысл
лямбда создает новые анонимные функции, которые, конечно, оцениваются каждый раз, когда вы их используете.
let создает временные имена для значений и устанавливается один раз для использования в области, определенной формой let.
Они действительно очень разные звери.
некоторые примеры:
(лямбда (x) (* 5 x))
(let ([x 2]) (* 5 x)) 10 (пусть ([f (lambda (x) (* 5 x))]) (f 2)) 10
первая форма создает функцию для умножения на 5
вторая форма присваивает 2 x и умножает ее на 5, в результате получается 10
третья мы используем функцию 1 (которая умножается на 5) и вызываем ее с помощью 2 в качестве параметра, что также дает 10