Другие языки программирования и технологии

Помошь с заданием c ++

lucas (n) возвращает n-ое число Лукаса и определяется рекуррентным соотношением F_n = F_n-1 + F_n-2 со начальными значениями F_0 = 2 и F_1 = 1.

func lucas(n uint) uint {
return 0
}
auto lucas(int n) -> int {
int f0 = 2, f1 = 1, f2;

for(int i = 2; i <= n; i++) {
f2 = f0 + f1;

f0 = f1;
f1 = f2;
}

return f2;
}
Андрей Адамбаев
Андрей Адамбаев
1 530
Лучший ответ
прочитай что такое рекурсия в программировании.. на википедии
Вит Шелопугин
Вит Шелопугин
93 007
int lucas(int n){
if(n==0)return 2;
if(n==1)return 1;
return lucas(n-1)+lucas(n-2);
}
Galib Esgerov А мой ответ чисел n меньших где-то примерно эдак тридцати (а то и сорока с небольшим!) вообще не касается! Тут как раз всё быстро считается именно с самой простой рекурсией и ещё чего-то там мудрить и огороды городить совершенно незачем!.. ☺
Тут функция, определяемая рекурсивно при n>1по простейшей формуле lucas(n)=lucas(n-1)+lucas(n-2), будет, во-первых, неоправданно чрезвычайно долго вычисляться при n где-то равнoм пятидесяти или чуть бóлее, а при подходе n к сотням тут и любой суперкомпьютер напрочь зависнет, да и ещё целый тип для значений этой функции должен быть не иначе как беззнаковым восьмибайтным, поскольку lucas(100)=17307588752571085255 и меньше чем шестьюдесяти четырьмя битами не записывается! При n>100 нужно уже оперировать более мощными типами целых чисел вроде Huge Integers (если они вообще есть или нетрудно их создать самому!). А вот пример быстрого (и, естественно, работающего!) кода с функцией lucas(n), значения кoторой при n>1 вычисляются не рекурсивно, а при помощи рекуррентно вычисляемых элементов динамического массива:

#include "iostream"

#include "cstdlib"

#define uns unsigned long long int

using namespace std; uns lucas(int n)

{ uns x,*f; if (n==0) return 2; else if (n==1) return 1; else { f=(uns*) malloc(8*(n+1)); f[0]=2; f[1]=1; for (int k=2; k <= n; k++) f[k]=f[k-1]+f[k-2]; x=f[n]; free(f); return x; } }

int main() { int k,n; for (;;) { cout <<

"n = ?\b"; cin >> n; for (k=0; k <= n; k++) cout << k << ' ' << lucas(k) << '\n'; } }
Лебедь Андрей
Лебедь Андрей
28 648
Радик Тухватуллин А зачем создавать массив, если после возврата он исчезнет? если уж не нравится рекурсия, достаточно хранить два предыдущих значения ( а вообще-то и одного хватит )
Радик Тухватуллин ежели на то пошло, то вариант рекурсии с кешированием

long lucas(int n){
static long _lucas[100]={2,1,0};
if(_lucas[n])return _lucas[n];
return _lucas[n]=lucas(n-1)+lucas(n-2);
}

int main() {
cout<<lucas(50);
return 0;
}