本篇文章给大家谈谈c语言组合不用递归,以及c语言组合数递归对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
1、用C语言求组合数2、c语言程序改成不使用递归的方法3、用c语言解决快速排序算法,不用递归?4、编写c语言程序解决约瑟夫问题,要求不用递归算法5、初学c语言问题,怎样不用递归解决hanoi塔问题
用C语言求组合数
实现的算法很多, 下面给出一个不需要递归的算法; 需要设计两个函数。
unsigned long factorial (unsigned long n);
long long perm(unsigned long m, unsigned long n);
unsigned long factorial (unsigned long n)
{
unsigned long value = (n == 0) ? 1 : n;
while( n = 2 )
value *= –n;
return value;
}
long long perm(unsigned long m, unsigned long n)
{
if (m n)
return -1;
else
return (unsigned long) (factorial(n)/factorial(n-m));
}
只为了mn就要返回-1, 有点浪费啊~~~
注意求值范围, 如果需要可以int64扩展。。。
c语言程序改成不使用递归的方法
比较麻烦,我只好写一写伪代码了
void print(struct node *n)
{
定义一个存储node*的链表list
将n装入list
bool flag=true;
while(flag)
{
flag=false;
for(从list第一个元素开始遍历,记遍历到的元素为k)
{
if (k-left!=null){ 将k-left插入到list中k的前面;flag=true;}
if (k-right!=null){ 将k-right插入到list中k的后面;flag=true;}
}
}
将list从头按次序输出
}
用c语言解决快速排序算法,不用递归?
可以用循环代替啊。所有的递归都是可以用循环加堆栈一类的东西代替的。
但是那会比较恶心,恶心到连本人这么勤奋的好学生都不愿意写……
如果你竟然真的写了一遍,保证你写完之后这辈子不会再想写第二遍!!!
所以,劝你还是别写了吧……
其实那玩意就跟数组邻接表一样,几乎没什么用
顶多写出来跟同学显摆显摆:瞧,姐会写不用递归的快排$^_^$
我以前就曾经写过不用指针的数组邻接表,直接导致了我被大家pia飞~
而且如果你写那玩意写多了,就没人看的懂你的程序了,包括你自己……
(本人的数组邻接表就是例子!!!)
所以,有时间还不如去琢磨琢磨其它用处比较大的算法
另外快排这种东西我不太喜欢,代码不好写,时间复杂度未知,如果运气不好就O(n^2)了……
所以建议你改用堆排,虽然常数项大一点,但是最起码时间有保证啊!而且代码好写又好看,看着四十多行,其实翻来覆去就那几句话。写完之后如果缩进合适,远看起来特别艺术C+_+C
编写c语言程序解决约瑟夫问题,要求不用递归算法
楼主你好!
下面这个就是关于约瑟夫问题的题目,代码(不是递归的)及题目已经给出,希望对你有帮助!
原题:
n个乘客同乘一艘船,因为严重超载,加上风高浪大,危险万分,因此船长告诉乘客,只有将部分乘客投入海中,其余人才能幸免于难。无奈,大家只得同意这种办法,并议定n个人围成一圈,由第1个人数起,依次报数,数到第m人,便把他投入大海中,然后再从他的下一个人数起,数到第m人,再将他扔到大海中,如此循环地进行,直到剩下k个乘客为止。问哪些位置是将被扔下大海的位置。
#includestdio.h
#includestdlib.h
struct list{ //定义链表的节点结构
int number; //用于给乘客的位置编号
struct list*next;
};
main(){
int i,n; //n表示人数,i用于for循环
struct list*head=NULL,*p,*q,*temp,*r;
printf(“请输入船上的人数n:\n”);
scanf(“%d”,n);
for(i=1;i=n;i++){ /*根据人数n,建立带头结点head循环链表*/
p=(struct list*)malloc(sizeof(struct list));
p-number=i; //给每位乘客位置编号
if(head==NULL){head=p;}
else {q-next=p;}
q=p;
}
p-next=head;
r=head;
int m,k,a=0; //m表示乘客数到这个需要下船的数,k表示最终船上剩余的乘客人数,a用于记录乘客总共报数的次数
printf(“请输入数到需要下船的数m\n”);
scanf(“%d”,m);
printf(“请输入最终船上剩余人数k\n”);
scanf(“%d”,k);
while(r!=NULLn!=k){
++a;
if((a+1)%m==0){ /*找出需下船乘客的前一位乘客,将需下船的乘客的节点删除,并将与下船乘客的相邻的两位乘客节点连起来,保证认是一个循环链表 */
temp=r-next;
r-next=r-next-next;
printf(“编号为%d位置的乘客需要下船!\n”,temp-number); //输出下船乘客的位置编号
free(temp);
n–;
}
else r=r-next;
}
}
初学c语言问题,怎样不用递归解决hanoi塔问题
#include stdio.h
#define MAXSTACK 10 /* 栈的最大深度 */
int c = 1; /* 一个全局变量,表示目前移动的步数 */
struct hanoi { /* 存储汉诺塔的结构,包括盘的数目和三个盘的名称 */
int n;
char x, y, z;
};
void move(char x, int n, char y) /* 移动函数,表示把某个盘从某根针移动到另一根针 */
{
printf(“%d- %d from %c – %c\n”, c++, n, x, y);
}
void hanoi(int n, char x, char y, char z) /* 汉诺塔的递归算法 */
{
if (1 == n)
move(x, 1, z);
else {
hanoi(n – 1, x, z, y);
move(x, n, z);
hanoi(n – 1, y, x, z);
}
}
void push(struct hanoi *p, int top, char x, char y, char z,int n)
{
p[top+1].n = n – 1;
p[top+1].x = x;
p[top+1].y = y;
p[top+1].z = z;
}
void unreverse_hanoi(struct hanoi *p) /* 汉诺塔的非递归算法 */
{
int top = 0;
while (top = 0) {
while (p[top].n 1) { /* 向左走到尽头 */
push(p, top, p[top].x, p[top].z, p[top].y, p[top].n);
top++;
}
if (p[top].n == 1) { /* 叶子结点 */
move(p[top].x, 1, p[top].z);
top–;
}
if (top = 0) { /* 向右走一步 */
move(p[top].x, p[top].n, p[top].z);
top–;
push(p, top, p[top+1].y, p[top+1].x, p[top+1].z, p[top+1].n);
top++;
}
}
}
int main(void)
{
int i;
printf(“递归:\n”);
hanoi(3, ‘x’, ‘y’, ‘z’);
printf(“非递归:\n”);
struct hanoi p[MAXSTACK];
c = 1;
p[0].n = 3;
p[0].x = ‘x’, p[0].y = ‘y’, p[0].z = ‘z’;
unreverse_hanoi(p);
return 0;
}
关于c语言组合不用递归和c语言组合数递归的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。