lucas (n) возвращает n-ое число Лукаса и определяется рекуррентным соотношением F_n = F_n-1 + F_n-2 со начальными значениями F_0 = 2 и F_1 = 1.
func lucas(n uint) uint {
return 0
}
Другие языки программирования и технологии
Помошь с заданием c ++
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;
}
int f0 = 2, f1 = 1, f2;
for(int i = 2; i <= n; i++) {
f2 = f0 + f1;
f0 = f1;
f1 = f2;
}
return f2;
}
прочитай что такое рекурсия в программировании.. на википедии
int lucas(int n){
if(n==0)return 2;
if(n==1)return 1;
return lucas(n-1)+lucas(n-2);
}
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'; } }
#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'; } }
Радик Тухватуллин
А зачем создавать массив, если после возврата он исчезнет? если уж не нравится рекурсия, достаточно хранить два предыдущих значения ( а вообще-то и одного хватит )
Радик Тухватуллин
ежели на то пошло, то вариант рекурсии с кешированием
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;
}
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;
}
Похожие вопросы
- Помогите с домашним задание C#
- Задания C# (массивы, матрицы).
- Вопрос по заданию c#.
- Помогите с заданием по C#
- Помогите с заданием на C++
- C++ задание по массивам
- Задание по структурам c++
- Учусь програмировать на C++ по книге "C++ для чайников".Проблема.
- visual c++ объясните, пожалуйста, что означает каждая строчка. задание: найти число различных элементов в массиве
- microsoft visual C++, помогите с заданием УМОЛЯЮ