已知函数t(n)=2*t(n/2)+n,其中t(0)=0,n为整数,用递归和非递归实现(栈实现)
2019-04-30 20:18
323 查看
非递归中用到了栈
#include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *next; }Node; typedef struct { Node *top; Node *base; }Stack; int InitNode(Stack *p) { p->base=(Node *)malloc(sizeof(Node)); if(!p->base) return 0; p->top=p->base; p->top->data=0; p->top->next=NULL; return 1; } int Push(Stack *p,int e) { Node *p1; p1=malloc(sizeof(Node)); if(p->base==p->top) { p1->data=e; p->top=p1; p1->next=NULL; } else { p1->data=e; p1->next=p->top; p->top=p1; } return 1; } int Pop(Stack *p,int e) { Node *p1; if(p->base==p->top) return 0; e=p->top->data; p1=p->top; p->top=p->top->next; free(p1); return 1; } int getTop(Stack *p,int e) { if(p->base==p->top) return 0; e=p->top->data; return e; } void print(Stack *p) { Node *p1; printf("栈内元素如下:\n"); if(p->base==p->top) { printf("栈为空!!\n"); exit(0); } p1=p->top; while(p1!=NULL) { printf("%d ",p1->data); p1=p1->next; } printf("\n"); } int Length(Stack *p) { int a=0; Node *p1; p1=p->top; while(p1!=NULL) { p1=p1->next; a++; } return a; } int getelem(Stack *p,int i) { Node *p1; int k=1,a=0; if(p->base==p->top) return 0; p1=p->top; while((p1!=NULL)&&(k<i)) { p1=p1->next; k++; } return p1->data; } int add(int x)//递归方法 { int a; if(x==0) a=0; else a=(2*add(x/2)+x); return a; } int main() { Stack p; int i,b=0,e=0,n,result=0,length=0;//i为循环变量,b储存栈顶元素(即运算结果),length为栈的长度 InitNode(&p); printf("请输入n,计算t(n):"); scanf("%d",&n); Push(&p,0); length=Length(&p); for(i=1;i<=n;i++) { e=2*getelem(&p,(length-(i/2)))+i; Push(&p,e); length=Length(&p); } b=getTop(&p,b); printf("\n用链栈得到的结果如下:\n"); printf("t(%d)= %d \n",n,b); printf("用递归方法得到的结果如下:\n"); result=add(n); printf("t(%d)= %d \n",n,result); return 0; }
相关文章推荐
- 递归方式实现 1:打印一个整数的每一位 2:实现函数求出n的k次方
- 实现一个计算整数因子和的简单函数,并利用其实现另一个函数,输出两正整数m和n 所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、
- 输入4个整数,找出其中最大的数,用一个函数来实现.cpp
- 从键盘任意输入10个整数,用函数编程实现将其中最大数与最小数的位置对换后,再输出调整后的数组。
- 作业题:输入4个整数,找出其中最大的数。用一个函数来实现. 分别使用结构化方法和函数嵌套的方法。
- sql 函数实现三种父子递归
- 7.1.19 已知string类的定义,给出函数实现
- 在不使用if,while,do...while,for,switch,?:等操作,实现函数void printLess(int k),返回小于k的所有整数
- C语言itoa()函数和atoi()函数详解(整数转字符C实现)
- 输入一组整数,找出这组数中最大值与最小值的下标,在主调函数中输出最大值和最小值,用指针实现。
- 实现一个拆分实数的整数与小数部分的函数。
- 我们现在有一些数据,是整数和字符串混杂的。现在需要你将他们分开,并且分别进行排序。 请你利用泛型实现一个数组类,并且实现排序函数,使得其既可以对Integer类型进行排序,又可以对String类型进
- 3. 用选择法实现对10个整数按从大到小的顺序排序输出(要求完成sort1函数)。
- 1.调整数组使奇数全部都位于偶数前面。 题目: 输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。
- 用一个函数实现将一行字符串中最短的单词输出。此行字符串从主函数传递给该函数。假设字符串中包含的单词以空格作为分隔符号,例如”Asia Games 2010 is held in GuangZhou.”,其中最短的单词是”is”和”in”。
- 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- [C语言]编写一个函数实现n^k,使用递归的方法。
- 实现一个函数int my_atoi(char s[]),可以将一个字符串转换为对应的整数。
- 整数乘法---FFT 的递归实现
- C++入门:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图。写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数