C语言程序设计 递归应用举例
c语言递归实现1到n的和
C语言递归实现1到n的和简介递归是一种常用的编程技巧,它通过函数自身的调用来解决问题。
在C语言中,递归可以用于实现各种算法和数据结构。
本文将介绍如何使用递归来计算1到n的和,通过详细的代码解释和示例演示,帮助读者理解递归的原理和使用方法。
递归的基本原理递归是一种通过函数自身的调用来解决问题的方法。
在递归中,函数会不断地调用自身,直到满足某个终止条件才停止调用。
递归可以分为两个阶段:递归调用和递归返回。
递归调用是指函数在执行过程中,自己调用自己。
在每次递归调用时,函数会使用不同的参数值,以便在每次调用中解决不同的子问题。
递归调用将问题分解为更小的子问题,直到达到终止条件。
递归返回是指函数在满足终止条件后,通过返回值将结果传递给上一层调用。
通过不断返回结果,最终得到整个问题的解。
递归实现1到n的和下面是使用递归实现1到n的和的C语言代码:#include <stdio.h>int sum(int n) {if (n == 1) {return 1;} else {return n + sum(n - 1);}}int main() {int n;printf("请输入一个正整数n:");scanf("%d", &n);printf("1到%d的和为:%d\n", n, sum(n));return 0;}在上面的代码中,我们定义了一个名为sum的递归函数,它接受一个整数参数n,并返回1到n的和。
在函数内部,我们使用了一个if-else语句来判断是否满足终止条件。
当n等于1时,递归终止,直接返回1。
否则,递归调用sum函数,并将n减1作为参数传入,然后将递归调用的结果与n相加返回。
在main函数中,我们首先从用户输入获取一个正整数n,然后调用sum函数计算1到n的和,并将结果打印出来。
递归的执行过程为了更好地理解递归的执行过程,我们以计算1到5的和为例,来逐步分析递归的调用和返回过程。
c语言递归算法简单例子
c语言递归算法简单例子嘿,聊聊C 语言的递归算法简单例子,老有意思啦!嘿,朋友们!今天咱来唠唠C 语言里那个神奇又有点让人摸不着头脑的递归算法,顺便看几个简单例子,保证让你大开眼界!递归算法就像是一只调皮的小猴子,在代码的树林里上蹿下跳,一会儿钻进这个函数,一会儿又从里面冒出来,还带回一些东西,可有意思啦!比如说计算一个整数的阶乘,这可是递归算法的经典例子呢。
我们来看看代码怎么写:```cinclude <>int factorial(int n) {if (n == 0 n == 1) {return 1;} else {return n factorial(n - 1);}}int main() {int num = 5;int result = factorial(num);printf("%d 的阶乘是:%d\n", num, result);return 0;}```你看哈,在这个factorial 函数里,它自己会不断地叫自己,就好像一直在问:“嘿,我下一个数的阶乘是多少啊?”然后就一层一层地往里钻。
直到遇到n 等于0 或者1 这个底部,才开心地说:“哦,我知道啦,是1 呀!”然后又一层一层地跑回来,把每层得到的结果相乘,最后得出最终答案。
感觉就像是小猴子在树洞里找到了宝贝,然后欢天喜地地跑出来。
还有一个有趣的例子,就是计算斐波那契数列。
这斐波那契数列啊,前面两个数是0 和1,后面的每个数都是前两个数的和。
我们也可以用递归算法来算算。
```cinclude <>int fibonacci(int n) {if (n == 0) {return 0;} else if (n == 1) {return 1;} else {return fibonacci(n - 1) + fibonacci(n - 2);}}int main() {int n = 10;for (int i = 0; i < n; i++) {printf("斐波那契数列第。
c++ 递归算法经典实例
以下是几个 C++ 递归算法的经典实例:斐波那契数列斐波那契数列是一个非常经典的递归算法。
在这个算法中,每个数字都是前两个数字的和。
例如,斐波那契数列的前几个数字是 0、1、1、2、3、5、8、13、21 等等。
以下是使用递归算法计算斐波那契数列的 C++ 代码:cint fibonacci(int n) {if (n <= 1) {return n;} else {return fibonacci(n - 1) + fibonacci(n - 2);}}阶乘阶乘是另一个经典的递归算法。
n 的阶乘表示为 n!,是从 1 到 n 的所有正整数的乘积。
例如,5 的阶乘是 5 * 4 * 3 * 2 * 1 = 120。
以下是使用递归算法计算阶乘的 C++ 代码:cint factorial(int n) {if (n == 0) {return 1;} else {return n * factorial(n - 1);}}二分查找二分查找是一种在有序数组中查找特定元素的递归算法。
在这个算法中,我们将数组分成两半,并检查中间元素是否是我们正在查找的元素。
如果是,我们返回该元素的位置。
如果不是,我们根据要查找的元素是大于还是小于中间元素,递归地在左半部分或右半部分数组中查找。
以下是使用递归算法实现二分查找的 C++ 代码:cint binarySearch(int arr[], int left, int right, int target) {if (right >= left) {int mid = left + (right - left) / 2;if (arr[mid] == target) {return mid;} else if (arr[mid] > target) {return binarySearch(arr, left, mid - 1, target); } else {return binarySearch(arr, mid + 1, right, target); }} else {return -1; // 元素不存在于数组中}}。
c语言递归函数示例
return n+1;
else if(n==0)
return Acm(m-1,1);
else
return Acm(m-1,Acm(m,n-1));
}
int main()
{
printf("Acm(2,1)=%d\n",Acm(2,1));
printf("Acm(3,2)=%d\n",Acm(3,2));
printf("结果是:%ld\n",answer);
}
结果说明:输入61再输入5求得61的5次幂为844596301.
2编写计算学生年龄的递归函数。
#include<stdio.h>
int age(int n)
{
int c;
if(n==1)
c=10;
else
c=age(n-1)+2;
return c;
return 0;
}
结果说明:利用递归函数求得Acm(2,1)=5,Acm(3,2)=29.
实验小结:
1.编写计算X的Y次幂的递归函数getpower(int x,int ),并在主程序中实现输入输出。
#include"stdio.h"
long getpower(int x,int y)
{
if(y==1)
return x;
else
return x*getpower(x,y-1);
}
void main()
}
void main()
{
int n=5;
printf("the five student'sage is:%d years old\n",age(n));
C语言中的递归函数应用
C语言中的递归函数应用递归函数在C语言中是一种非常重要且常用的编程技术,可以简化代码逻辑,实现程序的高效性和可维护性。
递归函数是指在函数中调用自身的函数,通过不断调用自身来解决问题,直到达到终止条件为止。
在C语言中,递归函数的应用非常广泛,比如在树的遍历、阶乘计算、斐波那契数列等方面都能看到递归函数的影子。
首先来看一个经典的递归函数示例,计算阶乘的函数:```cint factorial(int n) {if (n == 0) {return 1;} else {return n * factorial(n-1);}}```在上面的代码中,factorial函数通过调用自身来计算n的阶乘。
当n为0时,递归终止,返回1;否则,返回n与factorial(n-1)的乘积。
这种递归方式简洁而高效,使得代码更加易于理解。
另一个常见的应用是在树的遍历中,比如二叉树的先序、中序、后序遍历都可以通过递归函数实现。
以二叉树的中序遍历为例:```cvoid inorderTraversal(TreeNode* root) {if (root == NULL) {return;}inorderTraversal(root->left);printf("%d ", root->val);inorderTraversal(root->right);}```在上面的代码中,通过递归函数inorderTraversal实现了二叉树的中序遍历。
首先判断根节点是否为空,若为空则返回;否则,先递归遍历左子树,输出根节点的值,再递归遍历右子树。
这种递归方式简洁而直观,可以应用于各种树的遍历操作。
除此之外,递归函数还广泛应用于解决数学问题,比如求解斐波那契数列:```cint fibonacci(int n) {if (n == 0) {return 0;} else if (n == 1) {return 1;} else {return fibonacci(n-1) + fibonacci(n-2);}}```在上面的代码中,通过递归函数fibonacci实现了斐波那契数列的计算。
c语言递归解决台阶问题
c语言递归解决台阶问题(实用版)目录1.台阶问题的背景和描述2.递归算法的原理和应用3.C 语言实现递归算法的步骤4.递归算法的优点和局限性正文1.台阶问题的背景和描述台阶问题是一个经典的数学问题,描述如下:假设有一个楼梯,每阶的高度是 1,楼梯的总高度是 n,现在有一个人从楼梯的底部开始,每次可以爬 1 阶或者 2 阶。
假设这个人不能爬 3 阶或以上,问他有多少种不同的爬楼梯方法?2.递归算法的原理和应用递归算法是一种将问题分解为规模较小的相似子问题的解决方法。
在台阶问题中,我们可以将 n 阶楼梯划分为 n-1 阶和 n-2 阶两个子问题,然后通过求解子问题,最终得到 n 阶楼梯的解法。
3.C 语言实现递归算法的步骤以下是使用 C 语言实现台阶问题的递归算法的步骤:a.定义一个函数,如 int climbStairs(int n),表示求解 n 阶楼梯的方法数。
b.在函数内部,判断 n 的值。
如果 n 为 1 或 2,返回 1,因为只有 1 种或 2 种爬法。
c.如果 n 大于 2,返回 climbStairs(n-1) + climbStairs(n-2)。
这是因为我们可以从 n-1 阶楼梯爬 1 阶上来,也可以从 n-2 阶楼梯爬2 阶上来。
两个子问题的解法相加,即为 n 阶楼梯的解法。
d.在主函数中,调用 climbStairs(n) 函数,打印出结果。
4.递归算法的优点和局限性递归算法的优点是可以将问题分解为规模较小的相似子问题,易于理解和实现。
然而,递归算法的局限性是它的运行效率较低,因为存在大量的重复计算。
递归创建二叉树c语言
递归创建二叉树c语言递归创建二叉树是一种常用的算法,在C语言中实现起来比较简单。
本文将介绍如何使用递归方法创建二叉树,并给出相应的C语言代码示例。
我们需要了解什么是二叉树。
二叉树是一种特殊的树形结构,它的每个节点最多只能有两个子节点。
二叉树的每个节点包含一个值和指向其左右子节点的指针。
在C语言中,我们可以使用结构体来表示二叉树的节点。
结构体包含一个值和两个指针,分别指向左右子节点。
接下来,我们可以使用递归的方式来创建二叉树。
我们定义一个函数来创建二叉树的节点。
函数的输入参数是节点的值,返回值是一个指向新节点的指针。
函数的实现如下:```cstruct TreeNode {int value;struct TreeNode* left;struct TreeNode* right;};struct TreeNode* createNode(int value) {struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));newNode->value = value;newNode->left = NULL;newNode->right = NULL;return newNode;}```接下来,我们定义一个递归函数来创建二叉树。
函数的输入参数是一个数组,表示二叉树的前序遍历结果。
函数的返回值是一个指向根节点的指针。
函数的实现如下:```cstruct TreeNode* createTree(int* preorder, int start, int end) { if (start > end) {return NULL;}struct TreeNode* root = createNode(preorder[start]);int i;for (i = start + 1; i <= end; i++) {if (preorder[i] > root->value) {}}root->left = createTree(preorder, start + 1, i - 1);root->right = createTree(preorder, i, end);return root;}```以上代码中,我们首先判断数组的起始位置是否大于结束位置,如果是,则返回NULL。
c语言中的递归 (1)
c语言中的递归递归是一种常见的编程技巧,也是C语言中的重要概念之一。
通过递归,我们可以将一个复杂的问题分解成更小的子问题,从而简化解决方案。
在C语言中,递归函数是一种自己调用自己的函数,它可以通过不断调用自身来解决问题。
递归函数通常包含两个部分:基本情况和递归情况。
基本情况是指递归函数停止调用自身的条件,而递归情况则是指递归函数调用自身的情况。
在编写递归函数时,我们需要确保递归情况最终会达到基本情况,否则递归函数将陷入无限循环。
一个经典的例子是计算阶乘。
阶乘是指从1到某个正整数n的所有整数的乘积。
我们可以使用递归函数来计算阶乘。
首先,我们需要定义基本情况,即当n等于1时,阶乘的结果为1。
然后,我们定义递归情况,即当n大于1时,阶乘的结果为n乘以(n-1)的阶乘。
下面是一个使用递归函数计算阶乘的示例代码:```c#include <stdio.h>int factorial(int n) {if (n == 1) {return 1;} else {return n * factorial(n - 1);}}int main() {int n;printf("请输入一个正整数:");scanf("%d", &n);printf("%d的阶乘是%d\n", n, factorial(n));return 0;}```在上面的代码中,我们定义了一个名为factorial的递归函数,它接受一个整数n作为参数,并返回n的阶乘。
在递归情况中,我们调用了自身,并将n减1作为参数传递给递归函数。
当n等于1时,递归函数将返回1,从而达到基本情况。
递归函数的执行过程可以用一棵树来表示,这棵树被称为递归树。
每个节点表示一个函数调用,树的根节点表示初始函数调用,叶子节点表示基本情况。
通过递归树,我们可以更好地理解递归函数的执行过程。
然而,递归并不是解决所有问题的最佳方法。
c语言爬楼梯递归算法
c语言爬楼梯递归算法C语言是一门强大的编程语言,拥有广泛的应用领域。
在编程过程中,递归算法是一种非常重要的技巧。
而爬楼梯问题是一个经典的递归应用场景。
在这篇文章中,我们将一步一步地探讨如何使用C语言编写一个递归算法来解决爬楼梯的问题。
首先,让我们来了解一下爬楼梯问题的背景。
假设有一座楼梯,每次只能向上爬1步或2步。
假设我们要爬到楼梯顶部,问有多少种不同的方法可以实现这个目标。
为了解决这个问题,我们可以通过递归的方式来分析。
首先,让我们来思考一下简单的情况。
当楼梯只有1级时,只有一种方法可以达到楼梯顶部,即爬一步;当楼梯有2级时,有两种方法可以达到楼梯顶部,即一步一步地爬上去,或者一次性跨两级。
这些简单的情况给了我们一些启示,即当楼梯有n级时,我们可以将问题拆分为两个子问题:爬到n-1级楼梯的方法数,以及爬到n-2级楼梯的方法数。
而当楼梯有3级时,我们可以将其看作先爬到2级楼梯,再爬上一级的方式。
现在,我们可以写出一个初步的递归函数来解决这个问题。
让我们定义一个名为`climbStairs`的函数,该函数接受一个整数参数`n`,表示楼梯的级数。
函数的返回值是一个整数,表示爬到楼梯顶部的方法数。
我们将函数的实现如下:cint climbStairs(int n) {if (n == 1) {return 1;}if (n == 2) {return 2;}return climbStairs(n-1) + climbStairs(n-2);}在这段代码中,我们首先处理了基本情况。
当楼梯只有1级或2级时,我们直接返回相应的方法数。
然后,我们使用递归调用来解决更复杂的情况。
我们将楼梯的级数减1和减2分别传递给函数本身,并将两者的结果相加。
这样,我们就能得到爬到n级楼梯的方法数。
让我们来用一个例子来测试我们的代码。
假设楼梯有5级,我们可以调用`climbStairs(5)`来计算。
根据我们的递归算法,我们可以得到以下计算过程:climbStairs(5)= climbStairs(4) + climbStairs(3)= (climbStairs(3) + climbStairs(2)) + climbStairs(3)= (climbStairs(2) + climbStairs(1)) + climbStairs(2) + climbStairs(3) = 2 + 1 + 2 + (climbStairs(1) + climbStairs(2))= 2 + 1 + 2 + 1 + 2= 8从这个例子中,我们可以看到`climbStairs(5)`的结果是8,即有8种不同的方式可以爬到楼梯顶部。
c语言递归算法经典实例
c语言递归算法经典实例递归算法是计算机科学中的重要概念,也是C语言编程中常用的技术手段之一。
它可以用于解决各种问题,包括数学、图形、排序、搜索等领域。
在本文中,我们将以中括号内的内容为主题,详细介绍C语言递归算法的经典实例,并逐步回答一些相关问题。
首先,让我们从递归算法的定义开始。
递归算法是一种通过将问题分解为更小的子问题来解决问题的方法。
在使用递归算法时,我们首先解决最小的问题,然后逐步解决更大的问题,直到最终解决整个问题。
这种分而治之的思想是递归算法的核心。
接下来,让我们以斐波那契数列为例,详细介绍递归算法的应用。
斐波那契数列是一个经典的数学问题,其中每个数字都是前两个数字之和。
例如,序列的前几个数是1、1、2、3、5、8、...。
我们可以使用递归算法来计算斐波那契数列中的任意项。
首先,我们定义一个函数fibonacci,用来计算斐波那契数列中的第n项。
函数的定义如下:cint fibonacci(int n) {if (n <= 1) {return n;} else {return fibonacci(n-1) + fibonacci(n-2);}}在这个函数中,我们首先检查n是否小于或等于1。
如果小于或等于1,则直接返回n作为结果。
否则,我们通过递归调用fibonacci函数来计算n-1和n-2两个子问题的解,然后将它们相加。
接下来,让我们回答第一个问题:如何使用递归算法计算斐波那契数列的第n项?我们可以通过调用fibonacci函数来计算斐波那契数列中的第n项。
例如,要计算第10项的值,我们可以使用以下代码:cint result = fibonacci(10);printf("第10项的值是:d\n", result);这将打印出“第10项的值是:55”,因为斐波那契数列的第10项是55。
接下来,让我们回答第二个问题:递归算法如何工作?当我们调用fibonacci函数时,它会检查传递给它的参数n的值。
c语言九连环 ← 递归程序算法描述
c语言九连环← 递归程序算法描述一、概述九连环是一种经典的益智游戏,通过递归的方式可以有效地解决该问题。
本文档将详细描述如何使用C语言实现九连环的递归算法。
二、问题描述九连环是一个由9个环相连构成的环状结构,要求通过递归的方式求解九连环的解法。
每个环可以取下来再重新放上去,每次只能将相邻的两个环取下或放上,目标是找出一种方法将所有环都正确放置。
三、算法设计递归是一种解决问题的有效方法,可以解决九连环问题。
通过递归的方式,我们可以将九连环分解为两个部分:当前环和其它八个环。
当当前环放置好时,就可以将其取下来并处理其它八个环,这就是递归的基本思想。
具体的算法流程如下:1. 判断当前环是否能够放置到正确的位置上,如果不能则返回错误信息;2. 将当前环取下来,并递归处理其它八个环;3. 将当前环重新放置到正确的位置上;4. 返回当前环的状态信息。
四、代码实现以下是一个使用C语言实现九连环递归算法的示例代码:```c#include <stdio.h>#include <stdlib.h>#define MAX_NUMBER 9 // 九连环的最大环数#define MAX_SIZE 100 // 存储状态的数组大小// 存储状态的数组int state[MAX_NUMBER][MAX_SIZE];// 递归函数,求解九连环的解法int solve(int num, int pos, int size) {// 边界条件:当只有一个环时,已经成功放置了if (num == 1) {return 1;}// 当前环无法放置到正确位置上,返回错误信息if (state[num-1][pos] == -1) {return -1;}// 将当前环取下来,并处理其它八个环int ret = solve(num-1, pos+1, size); // pos+1表示下一个位置可以放置当前环if (ret == -1) { // 如果无法放置其它八个环,则返回错误信息return -1;} else { // 否则将当前环重新放置到正确位置上,并返回当前环的状态信息state[num-1][pos] = ret; // 将当前环的状态标记为已放置return ret+1; // 返回当前环的状态信息(已放置)}}int main() {// 初始化状态数组,表示每个位置上是否有环以及是否成功放置了for (int i = 0; i < MAX_NUMBER; i++) {for (int j = 0; j < MAX_SIZE; j++) {state[i][j] = -1; // 初始状态为未放置状态(-1)或错误状态(-2)}}// 设置第一个环成功放置的状态为已放置状态(0)和下一个位置可以放置下一个环的状态为已放置状态(1)state[0][0] = 0; // 第一个环成功放置状态为已放置状态(0)state[0][9] = 1; // 下一个位置可以放置下一个环的状态为已放置状态(1)// 通过递归求解九连环的解法,并输出结果信息(已放置的环数)int count = solve(MAX_NUMBER, 0, MAX_SIZE); // 从第一个位置开始求解九连环的解法,输出已放置的环数即可得到最终结果信息(即成功的解法) printf("成功解法:%d\n", count); // 将已放置的环数输出即可得到最终结果信息(即成功的解法)return 0;}```五、总结本文档详细描述了如何使用C语言实现九连环的递归算法,通过递归的方式将九连环分解为两个部分:当前环和其它八个环,并实现了相应的代码实现。
c语言直接递归和间接递归
c语言直接递归和间接递归递归是一种在函数内调用自身的编程技术。
递归分为直接递归和间接递归两种类型。
1. 直接递归(Direct Recursion):在直接递归中,函数直接调用自身。
以下是一个简单的C 语言直接递归的例子,计算阶乘:```c#include <stdio.h>int factorial(int n) {if (n == 0 || n == 1) {return 1;} else {return n * factorial(n - 1);}}int main() {int num = 5;printf("Factorial of %d is %d\n", num, factorial(num));return 0;}```上述例子中,`factorial` 函数直接调用自身来计算阶乘。
2. 间接递归(Indirect Recursion):在间接递归中,两个或多个函数相互调用,形成一个循环调用链。
以下是一个简单的 C 语言间接递归的例子,判断一个正整数是否为偶数:```c#include <stdio.h>// 声明函数isOdd,因为isEven 函数中会调用isOddint isOdd(int);int isEven(int n) {if (n == 0) {return 1; // 是偶数} else {return isOdd(n - 1);}}int isOdd(int n) {if (n == 0) {return 0; // 是奇数} else {return isEven(n - 1);}}int main() {int num = 6;if (isEven(num)) {printf("%d is even.\n", num);} else {printf("%d is odd.\n", num);}return 0;}```在上述例子中,`isEven` 函数调用`isOdd` 函数,而`isOdd` 函数又调用`isEven` 函数,形成了一个间接递归的关系。
c语言递归调用例子
c语言递归调用例子【篇一:c语言递归调用例子】* 小编已将正确代码放在左侧任务的“不知道怎么办”里* 小编希望各位童鞋独立完成哦~*///定义一个函数,传送人员序号进去,返回该序号员工的年龄。
int getage(numpeople) //定义返回的年龄 int age; //如果是第1个人的时候,年龄为10岁 if(numpeople==1) age=10; //这是回推墙,也就是结束递归的条件。
else //还没接触到回推墙,就自我调用,谓之递归。
age = getage(numpeople-1) //年龄等于上一个人的年龄加2 return age;int main() printf( 第5个人的年龄是%d岁 , getage(5));return 0;}【篇二:c语言递归调用例子】一、基本内容:c语言中的函数可以递归调用,即:可以直接(简单递归)或间接(间接递归)地自己调自己。
要点:1、c语言函数可以递归调用。
2、可以通过直接或间接两种方式调用。
目前只讨论直接递归调用。
二、递归条件采用递归方法来解决问题,必须符合以下三个条件:1、可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来的解决方法相同,只是所处理的对象有规律地递增或递减。
说明:解决问题的方法相同,调用函数的参数每次不同(有规律的递增或递减),如果没有规律也就不能适用递归调用。
2、可以应用这个转化过程使问题得到解决。
说明:使用其他的办法比较麻烦或很难解决,而使用递归的方法可以很好地解决问题。
3、必定要有一个明确的结束递归的条件。
说明:一定要能够在适当的地方结束递归调用。
不然可能导致系统崩溃。
三、递归实例例:使用递归的方法求n!当n 1时,求n!的问题可以转化为n*(n-1)!的新问题。
比如n=5:第一部分:5*4*3*2*1 n*(n-1)!第二部分:4*3*2*1 (n-1)*(n-2)!第三部分:3*2*1 (n-2)(n-3)!第四部分:2*1 (n-3)(n-4)!第五部分:1 (n-5)! 5-5=0,得到值1,结束递归。
C语言递归算法PPT演示课件
for (k=1;k<=10;k++)
cin>>a[k];
cin>>x;
search(x,L,R);
system("pause");
} void search(int x,int top,int bot) //二分查找递归过程
{
int mid;
if (top<=bot)
{ mid=(top+bot)/2;
an加入到k个子集中的任一个中去,共有k种加入方式,这样对
于an的每一种加入方式,都可以使集合划分为k个子集,因此
根据乘法原理,划分数共有k * S(n-1,k)个。
•16
综合上述两种情况,应用加法原理,得出n个元素的集合 {a1,a2,……,an}划分为k个子集的划分数为以下递归公 式:S(n,k)=S(n-1,k-1) + k * S(n-1,k) (n>k,k>0)。
确定n个元素a1 ,a2 ,……,an 放入k个无标号盒子中去
的划分数S(n,k)。
【输入样例】setsub.in
23 7
【输出样例】setsub.out
4382641999117305
•15
【算法分析】
先举个例子,设S={1,2,3,4},k=3,不难得出S有 6种不同的划分方案,即划分数S(4,3)=6,具体方案为:
int s(int n, int k)
//数据还有可能越界,请用高精度计算
{
if ((n < k) || (k == 0)) return 0;
//满足边界条件,退出
if ((k == 1) || (k == n)) return 1;
c语言递归算法及经典递归例子代码实现
c语⾔递归算法及经典递归例⼦代码实现⼀、什么叫做递归?⼀个过程或 函数 在其定义或说明中有直接或间接调⽤⾃⾝的⼀种⽅法;递归函数就是直接或间接调⽤⾃⾝的函数,也就是⾃⾝调⽤⾃⼰;刚接触递归的同学,可能难以理解递归,难以理解的点可能很多,例如:1.函数为什么可以在⾃⼰的内部⼜调⽤⾃⼰呢?2.既然可以⾃⼰调⽤⾃⼰,那么递归运⾏过程中⼀定回有很多层相互嵌套,到底什么时候不再嵌套呢?3.递归运⾏过程中,相互嵌套的多层之间会有参数传递,多层之间是否会相互影响?递归两个要素1.递归边界2.递归的逻辑——递归"公式"递归的过程⼀定有参数的变化,并且参数的变化,和递归边界有关系.在难度较⼤的题⽬中,这两者均不容易直接得到.递归的种种问题,也许理解的同学可能可以⽤⼀句话解释清楚,但是不理解的同学再怎么说也没办法理解.下⾯通过⼏个简单的例⼦【体会】⼀下递归,先从【感性】的⾓度理解递归.1.Fibonacci数我们直到Fibonacci数的递推公式为:F(0)=F(1)=1,F(n)=F(n-1)+F(n-2) n>=2;这个明显地给出了递归边界n=0或1的时候F(n)的值,和递归逻辑F(n)=F(n-1)+F(n-2),即递推公式.所以这个递归函数不难书写#includeusing namespace std;int F(int n)//函数返回⼀个数对应的Fibonacci数{ if(n0 || n1)//递归边界return 1; return F(n-1) + F(n-2);//递归公式}int main(){ //测试int n; while(cin >> n) cout << F(n) << endl;return 0;}2.阶乘阶乘的递归公式为:代码如下:#includeusing namespace std;int F(int n){ if(n==0)//递归边界return 1;return n*F(n-1);//递归公式}int main(){ int n; cin >> n; cout << F(n) << endl;return 0;}3.数组求和给⼀个数组a[]:a[0],a[1],…,a[n-1]如何⽤递归的⽅式求和?仍然是两个问题:递归边界和递归公式.递归边界是什么?⼀时不容易想到,但是我们想到了求和,多个数的求和过程是什么,x,y,z,w⼿动求和的过程是什么?步骤如下:x+y=a,任务变为a,z,w求和a+z=b,任务变为b,w求和b+w=c得出答案思考⼀下,【得出答案】这⼀步为什么就可以得出答案呢?(废话?)是因为,⼀个数不⽤相加就能得出答案.所以,递归的边界就是只有⼀个数.所以,递归边界有了,那么递归公式呢?其实⼿动计算过程中,隐含了递归公式:其中+为求两个数的和,F为求多个数的和的递归函数.代码如下:#includeusing namespace std;int F(int a[],int start,int end){ if(start==end)//递归边界return a[start];return a[start] + F(a,start+1,end);//递归公式}int main(){ int a[] = {1,2,3,4,5}; int s=0,e=4; cout << F(a,s,e) << endl;return 0;}4.求数组元素最⼤值⼿动求最⼤值的过程是什么,遍历+⽐较,过程如下:例如,求3,2,6,7,2,4的最⼤值:先设置最⼤值max=-999999,然后将max和数组元素逐个(遍历)⽐较如果a[i]>max,则更新max的值为a[i],否则max不变,继续向后遍历,直到遍历结束.max<3,则max=3max>2,max=3不变max<6,则max=6max<7,则max=7max>2,max=7不变max>4,max=7不变遍历结束,max=7为最⼤值.和求和类似,递归的公式如下:其中max为求两个数的较⼤值函数,F为求多个数的最⼤值的递归函数.代码如下:#includeusing namespace std;#define max(a,b) (a>b?a:b)int F(int a[],int s,int e){ if(s==e) return a[s]; else if(s+1 == e)//递归边界return max(a[s],a[e]);return max(a[s],F(a,s+1,e));//递归公式}int main(){ int a[] = {5,1,4,6,2}; int s = 0,e = 4; cout << F(a,s,e) << endl;return 0;}之所以,说上⾯的⼏个例⼦是【简单例⼦】,是因为上述所有的递归都属于【单向递归】.单向递归,递归的路径就是⼀个⽅向,所以思路相对⽐较容易想到.较难的递归问题,⼀般都不是单向递归,⽽是需要使⽤【回溯】的⽅法,递归的⽅法不太容易想到.写在最后每天晚上20:00我都会开直播给⼤家免费分享C/C++学习知识和路线⽅法,C/C++交流学习群:814974917,邀请码:洋洋。
c语言 递归函数 示例 -回复
c语言递归函数示例-回复[示例:C语言递归函数]递归函数在计算机编程中起着重要的作用,其具备自调用的特性,能够解决一些问题,简化程序的编写,提高代码的重用性。
本文将以C语言为例,详细介绍递归函数的定义、特性、使用方法以及递归算法的分析和实例。
一、递归函数的定义和特性递归函数是指在函数体内部调用自身函数的函数。
其定义如下:C返回值类型函数名(参数列表){函数体函数名(参数列表); 函数调用语句其他执行语句}递归函数具有以下特性:1. 自调用特性:在函数体内部,通过函数名调用本身函数,实现了函数体的重复执行。
2. 递归跳出条件:为了避免函数陷入死循环,递归函数必须设定一个跳出条件,当满足条件时,不再调用自身函数。
3. 数据传递:递归函数通过参数列表进行数据的传递,保证每次调用都是基于前一次调用的结果进行计算。
4. 堆栈操作:每次函数调用都会在内存中开辟一个新的栈帧,用来存储函数的局部变量、返回地址等信息,函数调用结束后,栈帧会被释放。
二、递归函数的使用方法递归函数的使用方法包括函数的定义、调用以及跳出条件的设置。
1. 函数定义:与普通函数定义类似,只是在函数体内部进行函数的自调用。
C返回值类型函数名(参数列表){跳出条件设置if (满足跳出条件){return 结果;}函数调用语句函数名(参数列表);其他执行语句}2. 函数调用:递归函数在函数体内部通过函数名调用本身函数,实现了函数体的重复执行。
C函数名(参数列表);3. 跳出条件设置:为了避免函数陷入死循环,递归函数必须设定一个跳出条件,当满足条件时,返回结果并结束函数调用。
Cif (满足跳出条件){return 结果;}三、递归算法的分析和实例递归函数在解决一些问题时具有简洁、直观、高效的特点。
下面通过一些经典的递归算法来详细说明递归函数的应用。
1. 阶乘函数阶乘函数是指对于正整数n,定义n的阶乘为n! = n * (n-1) * (n-2) * ... * 1。
C语言技术中的递归算法实现方法
C语言技术中的递归算法实现方法递归是一种重要的算法思想,在C语言中可以通过递归来解决许多问题。
递归算法的核心思想是将一个大问题分解为若干个相同或相似的小问题,通过解决小问题来解决大问题。
本文将介绍C语言中递归算法的实现方法。
一、递归算法的基本原理递归算法的基本原理是函数调用自身。
在递归算法中,函数会不断地调用自身,直到满足某个条件才停止调用。
通过递归,可以将一个复杂的问题转化为一个或多个相同或相似的子问题,从而简化问题的解决过程。
二、递归算法的实现步骤1.确定递归函数的参数和返回值:在实现递归算法时,首先需要确定递归函数的参数和返回值。
参数是指传递给递归函数的数据,返回值是指递归函数的计算结果。
2.确定递归的终止条件:递归算法必须有一个终止条件,当满足该条件时,递归调用停止。
否则,递归将无限循环,导致程序崩溃。
3.确定递归的递推公式:递归算法通过递归的方式解决问题,需要确定递归的递推公式。
递推公式是指将一个大问题分解为一个或多个相同或相似的小问题的公式。
4.编写递归函数的代码:根据确定的参数、返回值、终止条件和递推公式,编写递归函数的代码。
递归函数的代码应该包括递推公式的实现和终止条件的判断。
三、递归算法的实例下面通过一个实例来介绍递归算法的具体实现方法。
假设我们要计算一个正整数n的阶乘,可以使用递归算法来解决。
```c#include <stdio.h>int factorial(int n) {// 终止条件if (n == 0 || n == 1) {return 1;}// 递推公式return n * factorial(n - 1);}int main() {int n;printf("请输入一个正整数:");scanf("%d", &n);printf("%d的阶乘为%d\n", n, factorial(n));return 0;}```在上述代码中,我们定义了一个名为factorial的递归函数,该函数用于计算一个正整数n的阶乘。
c语言递归程序设计
关于递归程序设计1.什么是递归?(1)函数自已调用自己;(2)函数a调用函数b,而函数b又调用a。
2.递归算法的优缺点优点:源程序非常简洁,有一些算法本质上只有递归算法。
缺点:消耗较多的内存和运行时间,效率不高。
3.第一型递归算法(一切递推式都可化为递归)例1:用递归函数计算fac(n)=n!。
例2:用递归函数计算fibonacci数列第n项4.第二型递归算法(事件或操作递归)例1:用递归法实现N元数组a[0]~a[N-1]冒泡排序。
算法设计:a[0]~a[r]由大到小冒泡排序当r==0时,空操作;当r>0时,(1)将a[0]到a[r]中的最小元浮动到a[r];(2)对a[0]~a[r-1]选择排序void BubSort(int a[],int r) {int j,t;if(r <= 0)return;for (j = 0;j < r;j++)if (a[j] < a[j+1]) {t = a[j];a[j] = a[j+1];a[j+1] = t;}BubSort(a,r-1);} 第一次调用格式:BubSort(a,N-1);例2:用递归法实现N元数组a[0]~a[N-1]逆序存贮。
算法设计:a[s]~a[r]逆序存贮:当s>=r时,空操作;当s<r时,(1)交换a[s]与a[r]的值;(2)对a[s+1]~a[r-1]逆序存贮。
void reverse(int a[N],int s,int r) {int t;if (s >= r)return;t = a[s];a[s] = a[r];a[r] = t;reverse(a,s+1,r-1);}第一次调用格式: reverse(a,0,N-1);。
C程序设计------函数的递归调用(新模板)
明德 砺志 博学 笃行
void main() { printf(“%d”,age(5)); } 5 4 3 age(int n) { int t; if(n==1) t=10; else t=age(n-1)+2; return(t) ; }
int age(int n) int { int t; if(n==1) t=10; else t=age(n-1)+2; return(t) ; }
明德 砺志 博学 笃行
三、递归算法
递归调用与递归算法相适应,递归算法解决递归问题,通过递归调用可以将问题在 函数调用阶段化繁为简,再在函数返回阶段由简推繁得到最终答案。 递归算法的两个基本特征: 1、转化:对任意问题的求解都有一定的规则,首先将其转化为比原问题规模小的 类似问题,最终转化成一特定易解的类似问题。 类似问题的求解通过定义一个函数来完成;问题规模需转化成函数参数 的形式;问题规模(转换过程)用一定的条件描述 。 2、终止:对特定简单易解类似问题,有明确解,此时问题的规模即递归调用的终 止条件,常用选择语句进行流程控制。
2
age(int n) int { int t; if(n==1) t=10; else t=age(n-1)+2; return(t) ; }
1
int age(int n) int { int t; if(n==1) t=10; else t=age(n-1)+2; return(t) ; }
age(int n) { int t; if(n==1) t=10; else t=age(n-1)+2; return(t) ; }
}
int f1(int x) { int y,z; ...... z=f2(y); ...... }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
return 0; }
void invertLongInt(long x) {
if(x >=0 && x <= 9) printf("%d\n" , x);
else { printf("%d" , x % 10);
invertLongInt(x / 10); } }
return 0; }
int gcd(int x , int y) {
if( x % y = = 0) return y;
else
return gcd(y , x % y); }
程序运行结果:
请输入两个整数:341,132 341 , 132 的最大公约数是 11
【例 7-8】反向输出一个长整数 程序设计思路: (1) 如果要输出的数据只有一位,则“反向输出”问题可简化为输出一位整数。 (2) 如果要输出的数据超过一位,则可将该整数分为两部分:个位上的数字和个位以前 的数字。个位上的数字可以直接输出,而个位以前的数字又可以看成一个新的整数,重复执 行“反向输出”的操作。这时,反向输出在规模上缩小了一位,但求解的方法还是一致的。 (3) 用表达式 x % 10 可以分离出一个整数个位上的数字,用表达式 x / 10 可以表示出 个位以前的数。定义一个反向输出函数 invertLongInt,每次先用 x % 10 计算并输出个位 上的数,然后用 x / 10(即个位以前的数)做参数调用自己,不断进行下去,直到只剩一 位数字。 参考程序如下:
/*程序名:7_8.c*/ /*功能:反向输出一个长整数 */ #include <stdio.h> void invertLongInt(long);
int main() {
unsigned long iNumber;
printf("请输入一个整数:"); scanf("%ld" , &iNumber);
【例 7-7】计算两个整数的最大公约数。 程序设计思路:利用辗转相除法计算两个整数的最大公约数的算法如下: (1) 如果x除以y的余数为0,则y即为最大公约数,返回y值,算法结束。 (2) 如果x除以y的余数不为0,则用y和x%y做参数再重复求最大公约数。反复进行(1)、 (2)的操作。 例如x=341,y=132,341除以132,商是2,余数为77,因为余数≠0,所以置x=132,y=77, 依次类推,最后22除以11时,余数为0,算法终止,132和341的最大公因数是11。 参考程序如下:
上述定义将求解第 n 项化简为求解第 n-1 和 n-2 项,求解在规模上缩小了,但求解的 方法是一致的。
(2)定义 fibonacci 函数计算第 n 项的值 int fibonacci(int n)
{ if(n ==0 || n == 1) return 1; else return fibonacci( n – 1 ) + fibonacci( n – 2 );
}
(3)由于 fibonacci 数列增长很快,因此 fibonacci 函数返回值定义为 long。 参考程序如下:
/*程序名:7_6.c*/ /*功能:求 Fibonacci 数列第 n 项的值 */ #include <stdio.h> int fibonacci(int);
int main() {
/*递归函数的定义*/
return 1; else
return fibonacci ( n - 1) + fibonacci ( n - 2); }
程序运行结果:(分别运行 4 次程序)
请输入一个整数:10 Fibonacc( 10 ) = 55 请输入一个整数:10 Fibonacc( 20 ) = 6765 请输入一个整数:20 Fibonacc( 25 ) = 75025 请输入一个整数:30 Fibonacc( 30 ) = 832040
int n;
printf("请输入一个整数:"); scanf("%d", &n);
printf("Fibonacci ( %d ) = %ld", n, fibonacci (n) );
return 0; }
int fibonacci (int n) {
if (n = =0 || n = = 1)
7.3.3 递归应用举例
【例 7-6】求 Fibonacci 数列第 n ห้องสมุดไป่ตู้的值。Fibonacci 数列以 1,1 开头,以后每一项都 是前两项之和。
1,1,2,3,5,8,13,21…… 程序设计思路: (1)求 Fibonacci 数列第 n 项的值可用递归形式定义为:
fibonacci (0) = 1 fibonacci (1) = 1 fibonacci (n) = fibonacci (n - 1) + fibonacci (n - 2)
/*程序名:7_7.c*/ /*功能:求两个整数的最大公约数 */ #include <stdio.h> int gcd(int,int);
int main() {
int a , b;
printf("请输入两个整数:"); scanf("%d,%d", &a , &b);
printf("%d , %d 的最大公约数是 %d", a, b, gcd(a , b) );
程序运行结果:
请输入一个整数:123456 逆向输出结果为:654321