Сократить число до одной цифры, используя рекурсию

1
$result = reduce($number);

function reduce($number) {
    $new_number = 0;
    if($number < 10) {
        return $number;
    }           

    $q = floor($number / 10 );
    $r = $number % 10;
    $new_number = $q + $r;

    if($new_number <= 9) {          
        return $new_number;         
    }
    else {
        reduce($new_number);
    }
}

Я хочу суммировать цифры по его цифрам
Например, если я передаю 10, он должен вернуть 1 + 0 = 1
Это работает, если я прохожу 10
Но не работает, когда я пропускаю 100.

  • 0
    Вам необходимо добавить return к рекурсивному вызову. Он не возвращает рекурсивный вызов, как у вас есть.
  • 0
    Что вы имеете в виду с "не работает"?
Показать ещё 7 комментариев
Теги:
recursion
numbers

3 ответа

1
Лучший ответ

Вам не хватает слова return ближе к концу. Он должен выглядеть так:

return reduce($new_number);
4

Это должно сработать для вас:

Просто разделите свой номер на массив с помощью str_split() а затем используйте array_sum() чтобы добавить все цифры вместе.

echo array_sum(str_split($number));

РЕДАКТИРОВАТЬ:

Если вы не хотите контрольную сумму, но переходите к одной цифре, вам также не нужно писать такой код. Просто вызовите функцию снова и снова, пока array_sum() будет равен или меньше 9.

function reduceToOneSingleDigit($result) {
    $result = str_split($result);
    while(array_sum($result) > 9) 
        return reduceToOneSingleDigit(array_sum($result));
    return array_sum($result);
}

echo reduceToOneSingleDigit(99);
  • 0
    А что если сумма цифр больше 9? Сделать это снова? Вы не показываете, как продолжать делать это снова и снова, пока сумма не станет единственной цифрой (как требует вопрос).
  • 1
    Подождите, это решение работает, оно не рекурсивно, но оно работает, почему downvote? На самом деле это самый эффективный способ сделать это.
Показать ещё 9 комментариев
1

Просто слишком много кода, взгляните на следующий

print sum(125); // 8

// 5  12
// 2  1
// 1 + ~>0
function findSum($num)
{
    if($num == 0)
        return 0;
    return $num%10 + findSum(floor($num/10));   
}

так что даже 100000 или 000001 будет 1, работает так же, как и U, но у него будут проблемы, если paramater будет 0001000

Ещё вопросы

Сообщество Overcoder
Наверх
Меню