當前位置:首頁 » 編程語言 » 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;
}