SICP练习1.17中止!:超出最大递归深度

时间:2016-01-22 10:45:24

标签: sicp mit-scheme

我通过php解决它,它工作。但我尝试使用方案,我收到“中止!:超出最大递归深度”错误。我使用MIT / GNU Scheme微代码15.3 这是代码。

PHP

dates = Collections.synchronizedMap(dateDao.retrieveDates());

方案

function cc($a,$b)
{
    if($b==1){
        return $a;
    }elseif($b%2!==0){
        return $a+cc($a,$b-1);
    }else{
        return cc(double1($a),halve($b));
    }
}
function double1($i)
{
    return 2*$i;
}
function halve($i)
{
    return $i/2;
}

1 个答案:

答案 0 :(得分:1)

您的计划版本并不完全正确。它更像是这个PHP版本:

function cc($a, $b){
  if ($b === 1) { return $a; }

  call_user_func($b%2!==0, 
                 $a + cc($a, $b-1) );

  return else(cc(double1($a), halve($b)) );
}

也许这是一个更好的版本:

(define (cc a b)
  (cond ((= b 1) a)
        ((odd? b) (+ a (cc a (- b 1))))
        (else (cc (double a) (halve b)))))

请注意,标识反映了)cond第一行到最后一行的移动。