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

c语言递归法求数根

发布时间: 2022-08-10 11:18:53

1. c语言怎么算根号 递归

C语言中,有math.h库,引入之后,有一个sqrt函数,可以求平方根,另外,如果要求 x 的 y 次方跟,可以使用 pow 函数,举例如下:

C语言算根号

其中,sqrt就是求二次方根,pow其实求的是 x 的 n 次方,但是由于 x 的 n 次方跟等于 x 的 1/n 次方,所以也可以用于求根号,这里,第 6 行就是求得 16 的 4 次方根。

2. C语言 用递归方法求X的n次方

#include<stdio.h>

intpower(intx,intn)

{

if(n==0)

return1;

elseif(n%2==1)

returnx*power(x,n-1);

else{

inty=power(x,n/2);

returny*y;

}

}

intmain()

{

inta,b,c;

printf("enter x and n:");

setvbuf(stdout,NULL,_IONBF,0);

scanf("%d%d",&a,&b);

c=power(a,b);

printf("结果为%d",c);

return0;

}

(2)c语言递归法求数根扩展阅读

#include<stdio.h>

double power(double x,int n);

main()

{

double x;

int n;

printf("Input x,n:");

scanf("%lf,%d",&x,&n);

printf("%.2lf",power(x,n));

}

double power(double x,int n)

{

double a=1.0;

int i;

for(i=1;i<=n;i++)

a*=x;

return a;

}

3. C语言什么是递归方法

编程里面估计最让人摸不着头脑的基本算法就是递归了。很多时候我们看明白一个复杂的递归都有点费时间,尤其对模型所描述的问题概念不清的时候,想要自己设计一个递归那么就更是有难度了。今天我也花费了半个小时来搞明白二叉树的平衡性的递归模型,首先我不明白什么叫做平衡性,所以花费的时候大部分实在试探理解平衡性的含义。在搞明白的时候,我突然想到假如让我来设计,在我知道平衡性的前提下,我是否可以建立如此简洁的递归模型。为此,我遇到的问题是我们到底在什么情况下适用递归模型,并且递归模型如何建立。


数学都不差的我们,第一反应就是递归在数学上的模型是什么。毕竟我们对于问题进行数学建模比起代码建模拿手多了。 (当然如果对于问题很清楚的人也可以直接简历递归模型了,运用数模做中介的是针对对于那些问题还不是很清楚的人)


自己观察递归,我们会发现,递归的数学模型其实就是归纳法,这个在高中的数列里面是最常用的了。回忆一下归纳法。


归纳法适用于想解决一个问题转化为解决他的子问题,而他的子问题又变成子问题的子问题,而且我们发现这些问题其实都是一个模型,也就是说存在相同的逻辑归纳处理项。当然有一个是例外的,也就是递归结束的哪一个处理方法不适用于我们的归纳处理项,当然也不能适用,否则我们就无穷递归了。这里又引出了一个归纳终结点以及直接求解的表达式。如果运用列表来形容归纳法就是:


步进表达式:问题蜕变成子问题的表达式

结束条件:什么时候可以不再是用步进表达式

直接求解表达式:在结束条件下能够直接计算返回值的表达式

逻辑归纳项:适用于一切非适用于结束条件的子问题的处理,当然上面的步进表达式其实就是包含在这里面了。


这样其实就结束了,递归也就出来了。

递归算法的一般形式:

voidfunc(mode)
{
if(endCondition)
{
constExpression//基本项
}
else
{
accumrateExpreesion/归纳项
mode=expression//步进表达式
func(mode)//调用本身,递归
}
}

最典型的就是N!算法,这个最具有说服力。理解了递归的思想以及使用场景,基本就能自己设计了,当然要想和其他算法结合起来使用,还需要不断实践与总结了。

例如:返回一个二叉树的深度:

intdepth(Treet){
if(!t)return0;
else{
inta=depth(t.right);
intb=depth(t.left);
return(a>b)?(a+1):(b+1);
}
}


判断一个二叉树是否平衡:

intisB(Treet){
if(!t)return0;
intleft=isB(t.left);
intright=isB(t.right);
if(left>=0&&right>=0&&left-right<=1||left-right>=-1)
return(left<right)?(right+1):(left+1);
elsereturn-1;
}


上面这两个递归的难易程度就不一样了,第一个关于深度的递归估计只要了解递归思想的都可以短时间设计出来,但第二个估计就要长点时间了。纯递归问题的难易主要纠结于一些条件表达式的构造以及初值的设置(上面的为直接表达式值的设定)。

最后需要补充的是,很多不理解递归的人,总认为递归完全没必要,用循环就可以实现,其实这是一种很肤浅的理解。因为递归之所以在程序中能风靡并不是因为他的循环,大家都知道递归分两步,递和归,那么可以知道递归对于空间性能来说,简直就是造孽,这对于追求时空完美的人来说,简直无法接接受,如果递归仅仅是循环,估计现在我们就看不到递归了。递归之所以现在还存在是因为递归可以产生无限循环体,也就是说有可能产生100层也可能10000层for循环。例如对于一个字符串进行全排列,字符串长度不定,那么如果你用循环来实现,你会发现你根本写不出来,这个时候就要调用递归,而且在递归模型里面还可以使用分支递归,例如for循环与递归嵌套,或者这节枚举几个递归步进表达式,每一个形成一个递归。

4. c#用递归函数求一个数的数根

intgetShuGen(intnum)
{
if(num<10)
returnnum;
else
{
inttmp=num.ToString().ToArray().Sum<char>(b=>(byte)b-0x30);
returngetShuGen(tmp);
}
}

5. 求助 C语言高手 如何用递归调用法 求数列 1 2 2 4 8 32 。。。

#include <stdio.h>

int fib(int n) {
if (n == 1) return 1;
else return n * fib(n - 1);
}

void main(void) {
int n = 10;//这里改成你要的数字
printf("%d\n", fib(n));
}

6. 用C语言的函数递归方法来求

#include <stdio.h>

#include <math.h>

void fun2(int m)

{

int k=0,a[10];

for(int i=2;i<m;i++)

if(m%i==0)

a[k++]=i;

for(int i=0;i<k;i++)

{

printf("%d",a[i]);

if(i!=k-1)

printf(",");

}

}

void fun1(int m)

{

if(m<2)

printf("%d is a prime number",m);

for(int i=2;i*i<=m;i++)

if(m%i==0)

fun2(m);

else

printf("%d is a prime number",m);

}

int main( )

{ int n;

scanf("%d",&n);

fun1(n);

return 0;

}

7. C语言递归算法表示迭代求平方根的一个问题

这是我用C++写的,你稍微改一下就是C了。
用数组和循环处理就简单多了。

#include <cmath>
#include <iostream>
using namespace std;

int main()
{
int i;
double x[2]={1,0},a;
cout <<"\n\n\t请输入你要开平方的数:";
cin >>a;

for (i=0;fabs(x[i]-x[1-i])>=1e-5;i=1-i)
{
x[1-i]=(x[i]+a/x[i])/2;
}

cout<<"\n\n\t它的平方根为:"<<x[i]<<"\n\n\t";
system("pause");

return 0;
}

8. 模拟问题,求树根,c语言

intGetNumberRoot(intnum)
{
if(num<10)
{
returnnum;
}
intiTmp=num;
intiRoot=0;
while(iTmp>0)
{
iRoot=iRoot+iTmp%10;
iTmp/=10;
}
returnGetNumberRoot(iRoot);
}

intmain()
{
intiRoot=GetNumberRoot(123456);
printf("root:%d ",iRoot);
return0;
}

9. c语言中用递归法求X的平方根的问题

#include "stdio.h"
double mysqrt(double a,double x0)
{
double x1;
x1=(x0+a/x0)/2.0;
if(fabs(x1-x0)>0.0000000000001)
return mysqrt(a,x1);
else
return x1;
}
int main()
{
double x;
scanf("%lf",&x);
printf("The sqrt of %f=%f\n",x,mysqrt(x,1.0));
return 0;
}