#include <stdio.h>
#include <stdlib.h>
void dynInit(int n, int cache[])
{
int i;
if(n>=1) cache[1]=1;
if(n>=2) cache[2]=1;
for(i=3;i<=n;i++)
{
cache[i]=0;
}
}
int qRekursivDyn(int n, int cache[])
{
if(cache[n]) return cache[n];
return cache[n]=qRekursivDyn(n-qRekursivDyn(n-1,cache),cache) +qRekursivDyn(n-qRekursivDyn(n-2,cache),cache)
;}
int main()
{
int n = 0, *cache, i;
int ergebnisR;
printf("Nummer der gewuenschten Q-Zahl: ");
scanf("%i", &n);
if (n <= 0)
{
return 1;
}
cache = (int*) malloc((n+2) * sizeof(int));
if (cache == NULL)
{
printf("Zu wenig Speicher zur Berechnung einer so großen Q-Zahl.\n");
return 1;
}
dynInit(n, cache);
if(n <= 1000)
{
printf("Cache: ");
for (i=1; i<=n; i++) printf ("%3d ", cache[i]);
printf("\n");
printf("Berechne qRekursivDyn(n/2+1, cache):\n");
ergebnisR = qRekursivDyn(n/2+1, cache);
printf("Cache: ");
for (i=1; i<=n; i++) printf ("%3d ", cache[i]);
printf("\n");
printf("Berechne qRekursivDyn(n/4*3+1, cache):\n");
ergebnisR = qRekursivDyn(n/4*3+1, cache);
printf("Cache: ");
for (i=1; i<=n; i++) printf ("%3d ", cache[i]);
printf("\n");
printf("Berechne qRekursivDyn(n, cache):\n");
dynInit(n, cache);
ergebnisR = qRekursivDyn(n, cache);
printf("Cache: ");
for (i=1; i<=n; i++) printf ("%3d ", cache[i]);
printf("\n");
}
else
{
ergebnisR = qRekursivDyn(n, cache);
}
printf("\nDynamische rekursive Loesung: %i\n", ergebnisR);
return 0;
}
【TUM-EI-Programmieren】405 c) 递归
于 2023-02-21 06:55:23 首次发布
该程序使用C语言实现了一个递归函数qRekursivDyn,用于计算Q-数,并利用动态初始化的缓存提高效率。在内存允许的情况下,程序会为一定范围内的Q-数计算结果存储到缓存中,减少重复计算。代码包括了输入验证、内存管理以及不同步长的计算示例。
摘要由CSDN通过智能技术生成