当前位置:首页 » 编程语言 » 递归算法设计c语言
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

递归算法设计c语言

发布时间: 2022-10-10 04:07:31

c语言设计递归算法,将一个由数字组成的字符串转换成一个整数,并分


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
intfun(char*s)
{

if(*(s+1)!='')
{
returnpow((double)10,(double)strlen(s)-1)*(*s-'0')+fun(s+1);
}
else
{
return(*s-'0');
}
}
intmain(void)
{
printf("%d",fun("123456789"));

}

② C语言递归算法

int f(int n)
{
if (n>0)
{
return n*f(n/2);
}
else if(n==0)
{
return n+1;
}
}

③ c语言 设计一个递归算法

这哪是一个递归算法,这么多个:
给你设计其中一个:这是递归得到数组a【】的前k个元素的最大值
int max(int a[],int k)
{

if(k==2)return(a[0]>a[1]?a[0]:a[1]);
else return max(a,k-1)>a[k]? max(a,k-1):a[k];
}
可以这样试试看:
#include<stdio.h>
int max(int a[],int k)
{

if(k==2)return(a[0]>a[1]?a[0]:a[1]);
else return max(a,k-1)>a[k]? max(a,k-1):a[k];

}

main()
{ int t, b[]={1,2,3,4,5,6,7,8};
t=max(b,8);
printf("%3d",t); getch();
}

④ c语言函数递归的算法

这是一个递归调用fun(x)的算法。
首先会计算x=1时,因为x是int型,所以x/2==0,返回1,所以打印1.
然后再计算x=2时,这时返回x%2=0,所以打印0;
再计算x=4时,同样返回x%2=0,所以打印0;
最后计算x=8时,返回x%2=0,所以打印0。
所以屏幕输出的就显示1000 。

⑤ C语言递归算法

本人学c++,c的语法已经淡忘了,但是递归不管什么语言都是一个原理
其实简单一点来说就像数学里面的数列的通项公式:
例如一个数列是2,4,6,8,10......
很容易就可以得到通项公式是a[n]=2*n n是大于0的整数
你肯定学过这个数列的另外一种表示方式就是: a[1]=2, a[n]=a[n-1]+2 n是大于1的整数
其实这就是一个递归的形式,只要你知道初始项的值,未知项和前几项之间的关系就可以知道整个数列。
程序例子:比如你要得到第x项的值
普通循环:
for(int i=1; i<=n; i++)
if (i == x)
cout << 2*i; /*cout 相当于 c里面的printf,就是输出.*/
递归:
int a(int x) {
if (x = 1)
return 2; /* 第一项那肯定是2了,这个也是递归的终止条件! */
else return a(x-1)+2; /* 函数自身调用自身是递归的一个特色 */
比如x=4,那么用数学表示就是a(4)=a(3)+2=(a(2)+2)+2=((a(1)+2)+2)+2
其实递归方法最接近自然,也是最好思考的一个方法,难点就是把对象建模成递归形式,但是好多问题本身就是以递归形式出现的。
普通递归就是数据结构上的堆栈,先进后出。
例如上面x=4,把a(4)放入栈底,然后放入a(3),然后a(2),a(1),a(1)的值已知,出栈,a(1)=2,a(2)出栈a(2)=a(1)+2=2+2=4,a(3)出栈a(3)=a(2)+2=(a(1)+2)+2=6,a(4)出栈a(4)=a(3)+2=(a(2)+2)+2=((a(1)+2)+2)+2=8
再比如楼上的阶乘例子,当n=0 或 1时,0!=1,1!=1,这个是阶乘的初始值,也是递归的终止条件。然后我们知道n!=n*(n-1)!,当n>1时,这样我们又有了递归形式,又可以以递归算法设计程序了。(楼上已给出谭老的程序,我就不写了)。
我给出一种优化的递归算法---尾递归。
从我给出的第一算法可以看出,先进栈再出栈,递归的效率是很低的。速度上完全比不上迭代(循环)。但是尾递归引入了一个新的函数参数,用这个新的函数参数来记录中间值.
普通递归阶乘fac(x),就1个x而已,尾递归用2个参数fac(x,y),y存放阶乘值。
所以谭老的程序就变成
// zysable's tail recursive algorithm of factorial.
int fac(int x, int y) {
if (x == 1)
return y;
else return fac(x-1, y*x);}
int ff(int x) {
if (x == 0)
return 1;
else return fac(x,1);}
对于这个程序我们先看函数ff,函数ff其实是对fac的一个封装函数,纯粹是为了输入方便设计的,通过调用ff(x)来调用fac(x,1),这里常数1就是当x=1的时候阶乘值了,我通过走一遍当x=3时的值即为3!来说明一下。
首先ff(3),x!=0,执行fac(3,1).第一次调用fac,x=3,y=1,x!=1,调用fac(x-1,y*x),新的x=2,y=3*1=3,这里可以看到,y已经累计了一次阶乘值了,然后x还是!=1,继续第三次调用fac(x-1,y*x),新的x=1,y=2*3=6,然后x=1了,返回y的值是6,也就是3!.你会发现这个递归更类似于迭代了。事实上我们用了y记录了普通递归时候,出栈的乘积,所以减少了出栈后的步骤,而且现在世界上很多程序员都在倡议用尾递归取消循环,因为有些在很多解释器上尾递归比迭代稍微效率一点.
基本所有普通递归的问题都可以用尾递归来解决。
一个问题以递归来解决重要的是你能抽象出问题的递归公式,只要递归公式有了,你就可以放心大胆的在程序中使用,另外一个重点就是递归的终止条件;
其实这个终止条件也是包含在递归公式里面的,就是初始值的定义。英文叫define initial value. 用普通递归的时候不要刻意让自己去人工追踪程序,查看运行过程,有些时候你会发现你越看越不明白,只要递归公式转化成程序语言正确了,结果必然是正确的。学递归的初学者总是想用追踪程序运行来让自己来了解递归,结果越弄越糊涂。
如果想很清楚的了解递归,有种计算机语言叫scheme,完全递归的语言,因为没有循环语句和赋值语句。但是国内人知道的很少,大部分知道是的lisp。
好了,就给你说到这里了,希望你能学好递归。

PS:递归不要滥用,否则程序极其无效率,要用也用尾递归。by 一名在美国的中国程序员zysable。

⑥ c语言设计一个递归算法,输出2n行星号。第1行输出1个星号,第2行输出2

#include<stdio.h>
voidfunc(inta,intn)
{
inti;

for(i=0;i<a;i++)
printf("*");
printf(" ");
if(a<=n)func(a+1,n);
for(i=0;i<a;i++)
printf("*");
printf(" ");

}

intmain()
{
intn;
scanf("%d",&n);
func(1,n);

return0;
}

⑦ C语言中的递归是什么意思

程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。

递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。

一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。



(7)递归算法设计c语言扩展阅读:

递归的应用

1、数据的定义是按递归定义的。(Fibonacci函数)

2、问题解法按递归算法实现。这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。

3、数据的结构形式是按递归定义的。

递归的缺点

递归算法解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。


⑧ c语言递归算法

用递归法计算n!
用递归法计算n!可用下述公式表示:
n!=1 (n=0,1)
n×(n-1)! (n>1)
按公式可编程如下:
long ff(int n)
{
long f;
if(n<0) printf("n<0,input error");
else if(n==0||n==1) f=1;
else f=ff(n-1)*n;
return(f);
}
main()
{
int n;
long y;
printf("\ninput a inteager number:\n");
scanf("%d",&n);
y=ff(n);
printf("%d!=%ld",n,y);
}

程序中给出的函数ff是一个递归函数。主函数调用ff 后即进入函数ff执行,如果n<0,n==0或n=1时都将结束函数的执行,否则就递归调用ff函数自身。由于每次递归调用的实参为n-1,即把n-1的值赋予形参n,最后当n-1的值为1时再作递归调用,形参n的值也为1,将使递归终止。然后可逐层退回。
下面我们再举例说明该过程。设执行本程序时输入为5,即求5!。在主函数中的调用语句即为y=ff(5),进入ff函数后,由于n=5,不等于0或1,故应执行f=ff(n-1)*n,即f=ff(5-1)*5。该语句对ff作递归调用即ff(4)。
进行四次递归调用后,ff函数形参取得的值变为1,故不再继续递归调用而开始逐层返回主调函数。ff(1)的函数返回值为1,ff(2)的返回值为1*2=2,ff(3)的返回值为2*3=6,ff(4)的返回值为6*4=24,最后返回值ff(5)为24*5=120。

⑨ C语言用递归算法编写一个程序求Fibonacci数列的第n项的数值

#include
unsigned
int
Fibonacci(int
n);
int
main(
void
)
{
int
i;
for(i
=
1
;i
<=
20;i
++)
{
printf("%d\n",Fibonacci(i));
}
return
0;
}
unsigned
int
Fibonacci(int
n)
{
if(
n
==
1
||
n
==
2)
//
递归结束的条件,求前两项
return
1;
else
return
Fibonacci(n-1)+Fibonacci(n-2);
//
如果是求其它项,先要求出它前面两项,然后做和。
}
这种算法效率比较低
哪里不清楚可以Hi我

⑩ c语言 递归算法

1 你得到 的代码,就应该知道fac的作用
2 是结束递归条件
3、是结束时终值