Я изучаю sicp 1.3 (Формулирование абстракций с процедурами высшего порядка). Код схемы может вычислять сумму кубов целых чисел от a до b.
(define (sum term a next b)
(if (> a b)
0
(+ (term a)
(sum term (next a) next b))))
(define (inc n) (+ n 1))
(define (cube x) (* x x x))
(define (sum-cubes a b)
(sum cube a inc b))
И я хочу сделать это по php, вот код.
function sum($term,$a,$next,$b){
if ($a>$b){
return 0;
}else{
return $term($a) + sum($term,$next($a),$next,$b);
}
}
function inc($n){
return $n + 1;
}
function cube($x){
return $x*$x*$x;
}
function sum_cubes($a,$b){
return sum(cube,$a,inc,$b); // line 15
}
это работает, но я получил
PHP Notice: Use of undefined constant cube - assumed 'cube' in Command line code on line 15
,
PHP Notice: Use of undefined constant inc - assumed 'inc' in Command line code on line 15
Это нормально, и есть ли лучший способ добиться этого?
Ваша реализация немного неполна.
'cube'($x)
допустимый PHP, но не очень хороший способ вызвать функцию в PHP. (Это также очень страшно, что это даже работает.)
Используя call_user_func, Вы можете успешно применить любой подлежащий выкупу
function sum($term, $a, $next, $b) {
if ($a > $b)
return 0;
else
return call_user_func($term, $a)
+ sum($term, call_user_func($next, $a), $b);
}
Из того, что я вижу здесь, оператор return вызывает функции cube и inc, но они требуют входных параметров. Если вы не называете их здесь (что, я думаю, имеет место), то вы должны передавать форварды, но с $ перед их именами.
РЕДАКТИРОВАТЬ: Имейте в виду, что для этого требуется PHP 5.3.0 или выше. Увидеть руководство для получения дополнительной информации.
Я решил это, просто заключил имя функции в кавычки.
function sum_cubes($a,$b){
return sum('cube',$a,'inc',$b);
}