遞迴和非遞迴方式實現不同的問題
阿新 • • 發佈:2018-12-15
編寫一個函式實現n^k,使用遞迴實現
#include <stdio.h>
int fun(int n,int k) //求n的k次方
{
int sum;
if (k==0)
{
sum=1;
}
else
{
sum=n*fun(n,k-1);
}
return sum;
}
int main ()
{
printf("%d\n",fun(2,3));
return 0;
}
寫一個遞迴函式DigitSum(n),輸入一個非負整數,返回組成它的數字之和,例如,呼叫DigitSum(1729),則應該返回1+7+2+9,它的和是19
#include <stdio.h> int DigitSum(int n) { int sum=0; int m=0; if(n!=0) { m=n%10; n=n/10; sum=m+DigitSum(n); } return sum; } int main () { int a; printf("請輸入一個整數: "); scanf("%d",&a); printf("各位數之和為:%d\n",DigitSum(a)); return 0; }
編寫一個函式reverse_string(char * string)(遞迴實現)
實現:將引數字串中的字元反向排列。
要求:不能使用C函式庫中 的字串操作函式。
#include <stdio.h> char * reverse_string(char *p) { int n = 0; char temp; char *q; while( *p != 0 ) { n++; p++; } if( n > 1) { temp = q[0]; q[0] = q[n-1]; q[n - 1] = '\0'; reverse_string( q+1 ); q[n - 1] = temp; } return q; } int main() { char p[] = "dandanwa"; printf("原字串是:%s\n",p); printf("翻轉後的字串是:%s\n",reverse_string(p)); return 0; }
遞迴和非遞迴分別實現strlen
非遞迴
#include<stdio.h>
int my_strlen(char *str)
{
int count = 0;
while('\0' != *str)
{
count++;
str++;
}
return count;
}
int main()
{
char *str = "abcdef";
int len = my_strlen(str);
printf("%d\n", len);
return 0;
}
遞迴
#include<stdio.h> int my_strlen(char *str) { if ('\0' == *str) return 0; else return 1 + (my_strlen(str + 1)); } int main() { char *str = "abcdef"; int len = my_strlen(str); printf("%d\n", len); system("pause"); return 0; }
遞迴和非遞迴分別實現求n的階乘
非遞迴
#include <stdio.h>
int fac(int n)
{
int ret = 1;
int i = 0;
for (i = 1; i <=n; i++)
{
ret = ret*i;
}
return ret;
}
int main()
{
int n = 0;
printf("請輸入一個數:");
scanf_s("%d", &n);
int fac(n);
printf("%d\n", fac(n));
return 0;
}
遞迴
#include <stdio.h>
int fac(int n)
{
if (n <= 1)
{
return 1;
}
else
{
return n*fac(n - 1);
}
}
int main()
{
int n = 0;
printf("請輸入一個數:");
scanf_s("%d", &n);
int fac(n);
printf("%d\n", fac(n));
return 0;
}
遞迴方式實現列印一個整數的每一位
#include <stdio.h>
void print(int n)
{
if (n>9)
{
print(n/10);
}
printf("%d ", n%10);
}
int main()
{
print(1234);
return 0;
}