2012-04-16 3 views
2

я узнал о Горнере здесь впервые: Horner's rule in C++ Так как я учусь о рекурсии банкомате, я задавался вопрос, если это возможно реализовать этот алгоритм, используя рекурсию?Хорнера Правило C/C++ с помощью рекурсии

int HornerR(int a[], int n, int x, int index) 
{ 
    if (index==n) return a[n]; 
    else 
     return x*HornerR(a,n ,x,index+1) + a[index]; 
} 

Я думаю, что это возможно только с четвертым параметром.

+1

Да, это должно быть возможно, чтобы написать с рекурсией, попробуйте. Если у вас есть проблема, вы можете задать другой вопрос (или отредактировать этот) и перейти оттуда. – twain249

+0

Интересно, есть ли способ реализовать это без параметра индекса ... ?? – user1290709

+0

На самом деле это было то же самое, что я придумал и, похоже, сработал. Если есть способ без четвертого параметра, я не придумал его. – twain249

ответ

2

Вы можете сделать это с указателем арифметика:

  1. Base Case в конце массива (проверьте п) вернуть постоянный параметр
  2. Рекурсивный случай обратный ток ячейки добавляется к переменной, умноженное рекурсивный вызов
  3. Рекурсивный Вызов переместите массив в следующую ячейку и обновите счетчик (n)

В основном это позволяет рассчитать индексную переменную, переместив массив в следующую позицию и посылая это (и всегда используя первую ячейку) вместо отправки всего массива каждый раз

+0

@JerryCoffin Я изменил его на способ. – twain249

+0

Yup - намного лучше (по крайней мере, IMO). –

+0

@JerryCoffin Я думал об этом с самого начала, так как он сначала задал вопрос и немного взволновался, когда понял. – twain249

0

Чтобы не пропустить указатель, подумайте о a как о указателе (так как оно есть). Наряду с этим вам нужно будет уменьшить n и следить за тем, уменьшилось ли оно до нуля, а не отслеживать, index==n.

1

Вы можете реализовать функцию следующим образом с помощью 3 аргументов в функции, при условии, что массив pi содержит коэффициенты от наивысшей степени до 0 из индекса 0 до степени + 1. Ex для 3x^2 + 2x^1 + 1 => pi [3] = {3,2,1}

int compute_by_horner(int *pi, int degree, int x) 
{ 
int i, j; 

if (degree == 0) 
{ 
    return pi[0]; 
} 

return compute_by_horner(pi, degree-1, x) * x + pi[degree]; 

} 
Смежные вопросы