PHP: простая рекурсивная функция в итеративную функцию - PullRequest
2 голосов
/ 05 ноября 2010

Я собирался сделать это на C, но был сбит с толку, поэтому я обратился к PHP и смог скопировать рекурсивную функцию для этого.Я конвертирую целое число в строку с математикой.Вот оно:

function intToString($myDecimal){
    if($myDecimal < 10) {
        return $myDecimal;
    }
    return intToString(($myDecimal / 10)) . ($myDecimal % 10);
}

Я был в состоянии преобразовать рекурсивную факториальную функцию раньше ... но с этим я просто понятия не имею .. Моя попытка следующая:

function intToStringIter($myDecimal){
    $out = "";
    while($myDecimal > 10) {
        $myDecimal /= 10;
        $out .= $myDecimal;
    }
    $out .= $myDecimal % 10;
    return $out;
}

Я думаю, что я слишком устал, чтобы видеть правильную логику в данный момент ... Возвращается 22 вместо 20, я не могу обернуть голову вокруг того, что правильно.Вы понимаете, что я делаю не так?

Ответы [ 2 ]

1 голос
/ 05 ноября 2010

Если вы ищете преобразование в строку для больших целых без знака, код на самом деле:

function intToString($myDecimal)
{
    return sprintf('%u', $myDecimal);
}

Если вам нужно сделать это с итерацией:

function intToString($myDecimal)
{
    $result = '';
    while ($myDecimal > 9) {
        $result = ($myDecimal % 10) . $result;
        $myDecimal /= 10;
    }
    return $myDecimal . $result;
}

ОБНОВЛЕНИЕ: Мои плохие, цифры были вставлены в обратном порядке.Теперь это должно работать.Извините, тоже не проверял.

0 голосов
/ 05 ноября 2010

PHP не очень строг с переменными.Целое число станет float, если ситуация понравится.В вашем коде $myDecimal /= 10 может сделать плавающее число $myDecimal.Следующее заставляет $ myDecimal оставаться целым числом.Примечание: вы должны передавать только целые числа, если вы передаете 9.99, результат все равно будет 9.99, поскольку 9.99 < 10.

function intToStringIter($myDecimal){
    $out = "";
    while($myDecimal >= 10) {
        $myDecimal = (int) ($myDecimal / 10);
        $out .= $myDecimal;
    }
    $out .= $myDecimal % 10;
    return $out;
}
...