Рекурсивная функция c

#c #recursion

#c #рекурсия

Вопрос:

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

Функция принимает счетчик k и до тех пор, пока счетчик больше нуля, я хотел бы вызывать его рекурсивно, чтобы в итоге у меня получилось что-то вроде этого:

 result = 2(2(2n 1) 1) 1
  

где последнее n (при k = 0) должно быть равно нулю.

 int pass(int k, int n)
{
    if(k==0)
    {
        n = 0;
    }
    else
    {
        k--;
        return pass(k, 2*n 1);
    }
}
  

Может кто-нибудь дать мне подсказку о том, как это сделать?

Комментарии:

1. Вам нужен базовый вариант для этой рекурсии. если k ==0, вы должны вернуть 0, а не просто установить n.

2. Если k==0 , функция возвращает без return инструкции. Это приводит к неопределенному поведению.

3. Я изменил, чтобы возвращать 0;, но это все еще не работает.

Ответ №1:

Изменение

 n = 0;
  

Для

 return n;
  

Чтобы вернуть результат.

Остальная часть кода в порядке

Ответ №2:

В настоящее время поведение вашего кода не определено, поскольку вы явно не возвращаете значение для всех путей управления.

Ваш код может быть упрощен до:

 int pass(int k, int n)
{
    return k ? 2 * pass(k - 1, n)   1 : 1;
}
  

Здесь я использовал троичный условный оператор. 2 * pass(k - 1, n) 1 возвращается, если k не равно нулю, в противном случае возвращается 1.

Будьте осторожны, чтобы не переполнить ваш int в этом случае. Обратите внимание, что максимальный размер int может быть всего 32767. Рассмотрите возможность использования long типа вместо этого.

Также обратите внимание, что рекурсия обычно не является хорошим способом решения проблем типа O (n); вы можете получать ошибки во время выполнения из-за превышения предела стека вызовов функций: вместо этого рассмотрите сворачивание в цикл.

Комментарии:

1. Хотя это просто для меня, вас и других программистов, это не может быть более простым (читаемым) для кого-то, кто еще не знаком с ternary op.

2. Я как раз собирался представить решение с использованием шаблонов 😉

3. @TimBeaudet тогда пришло время ознакомиться с троичной операцией. Меня больше озадачивает упрощение формулы…

4. Думаю, я ошибаюсь. Упс. Результирующий термин является функцией от n.