函數和遞歸

函數:分爲庫函數和自定義函數
自定義函數和庫函數同樣,有函數名、返回值類型和函數參數;可是不同的是這些都是咱們本身來設計。算法

函數的調用:
傳值調用:
函數的形參和實參分別佔用不一樣的內存塊,對形參的修改不會影響實參
傳址調用:
傳址調用是把函數外部建立變量的內存地址傳遞給函數參數的一種調用函數的方式
這種傳參方式可讓函數和函數外部的變量創建起真正的聯繫,也就是函數內部能夠直接操做函數外部的變量。
#define _CRT_SECURE_NO_WARNINGS 1編程

#include <stdio.h>數組

void Swap2(int pa, int pb)
{
int tmp = 0;
tmp = pa;
pa = pb;
pb = tmp;
}ide

int main()
{
int a = 10;
int b = 20;
printf("a=%d b=%d\n", a, b);
Swap2(&a, &b);
printf("a=%d b=%d", a,b);
return 0;函數

}測試

//int main()
//{
// int a = 10;
// int pa = &a;
//
pa = 20;
// printf("%d\n", a);
// return 0;
//}設計

//void Swap(int x, int y)
//{
// int tmp = 0;
// tmp = x;
// x = y;
// y = tmp;
//}
//
//int main()
//{
// int a = 10;
// int b = 20;
// /int tmp = 0;/
// printf("a=%d b=%d\n", a, b);
// Swap(a, b);
// /tmp = a;
// a = b;
// b = tmp;
/
// printf("a=%d b=%d\n", a, b);
// return 0;
//}
練習:
一、寫一個函數能夠判斷一個數是否是素數。
二、寫一個函數判斷一年是否是閏年。
三、寫一個函數,實現一個整形有序數組的二分查找
四、寫一個函數,每調用一次這個函數,就會將num的值增長1。code

函數的遞歸:
程序調用自身的編程技巧稱爲遞歸,遞歸做爲一種算法在程序設計語言中普遍應用,一個過程或函數在其定義或說明中有直接或間接調用自身的一種方法,它一般把一個大型複雜的問題層層轉化爲一個與原問題類似的規模較小的問題求解,遞歸策略只需少許的程序既能夠描述出解題過程所須要的屢次重複計算,大大地減小了代碼量。遞歸的主要思考方式在於:把大事化小
遞歸的兩個必要條件:
一、存在限制條件,當知足這個條件的時候,遞歸便再也不繼續。
二、每次遞歸調用以後愈來愈接近這個限制條件。
//函數的遞歸
//int main()
//{
// printf("hehe\n");
// main();//棧溢出
// return 0;
//}遞歸

void print(int n)//1234
{
if (n > 9)//遞歸的條件1
{
print(n / 10);//遞歸的條件2
}
printf("%d", n % 10);
}內存

int main()
{
unsigned int num = 0;
scanf("%d", &num);//1234
print(num);
return 0;
}

編寫函數不容許建立臨時變量,求字符串長度
#define _CRT_SECLRE_NO_WARNINGS 1

#include <stdio.h>

//建立臨時變量,求字符串的長度
//int my_strlen(char str)
//{
// int count = 0;
// while (
str != '\0')
// {
// count++;
// str++;
// }
// return count;
//}

//建立函數不容許建立臨時變量,求字符串的長度用遞歸的方法
int my_strlen(char str)
{
if (
str != '\0')
return 1 + my_strlen(str + 1);
else
return 0;
//巴大事化小
//my_strlen("bit");
//1+my_strlen("it");
//1+1+my_strlen("t");
//1+1+1+my_strlen("\0");
//1+1+1+0;
//3
}

int main()
{
char arr[] = "bit";
//int len = strlen(arr);//求字符串長度
//printf("%d\n", len);
//模擬實現一個strlen函數
int len = my_strlen(arr);//arr是數組,數組傳參,傳過去的不是整個數組,而是一個元素的地址
printf("len = %d\n", len);

return 0;

}

遞歸與迭代
遞歸:函數本身調用本身就是遞歸;
迭代:就是重複去計算一個事情,重複去作一個事情;
求n的階乘
#define _CRT_SECLRE_NO_WARNINGS 1

#include <stdio.h>

////循環
//int Fac1(int n)
//{
// int i = 0;
// int ret = 1;
// for (i = 1, i <= n, i++)
// {
// ret *= i;
// }
// return ret;
//}
//
//int main()
//{
// //求n的階乘
// int n = 0;
// int ret = 0;
// scanf("%d", &n);
// ret = Fac1(n);//循環的方式
// printf("%d\n", ret);
//
// return 0;
//}

//遞歸
int Fac2(int n)
{
if (n <= 1)
return 1;
else
return n * Fac2(n - 1);
}

int main()
{
//求n的階乘
int n = 0;
int ret = 0;
scanf("%d", &n);
ret = Fac2(n);//循環的方式
printf("%d\n", ret);

return 0;

}

求第n個斐波那契數(不考慮溢出)
1 1 2 3 5 8 13 21 34
#define _CRT_SECLRE_NO_WARNINGS 1

#include <stdio.h>

//迭代
int Fib(int n)
{
int a = 1;
int b = 1;
int c = 0;
while (n > 2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}

int main()
{
int n = 0;
int ret = 0;
scanf("%d", &n);
ret = Fib(n);
printf("ret = %d\n", ret);
return 0;
}

////遞歸
//int count = 0;
//int Fib(int n)
//{
// if (n == 3)//測試第三個斐波那契數的計算次數
// {
// count++;
// }
// int ret = 0;
// if (n <= 2)
// return 1;
// else
//
// return Fib(n - 1) + Fib(n - 2);
//
//}
//
//int main()
//{
// int n = 0;
// int ret = 0;
// scanf("%d", &n);
// ret = Fib(n);
// printf("ret = %d\n", ret);
// printf("count =%d\n",count);
// return 0;
//}

函數遞歸的幾個經典題目(自主研究):一、漢諾塔問題二、青蛙跳臺問題《劍指offer》67道筆試題

相關文章
相關標籤/搜索