你怎么把算法转换成程序?

zyx11 2001-07-19 08:31:57
怎么实现算法与程序?可不可以举一个例子?希望是比较容易理解的
...全文
664 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangning111 2001-07-21
  • 打赏
  • 举报
回复
"能够用图灵机表示的必为可计算的"好象还没有证出来,谁要是能证出来不得诺贝尔奖也能得图灵奖。
netpaladin 2001-07-21
  • 打赏
  • 举报
回复
小土豆仙可真够神的;
starfish 2001-07-20
  • 打赏
  • 举报
回复
这个问题100年前就有人提出了,只不过那个时候还没有计算机。这个问题其实就是一个语言的翻译问题。我们想出来的算法是算法语言描述的(伪代码、自然语言、数学语言,etc),但是如何能够翻译成计算机语言呢?是否一定可以翻译成计算机语言呢?由此问题发展出了形式语义学、计算理论、程序设计科学、程序自动化、编译理论、……etc个方面的科学理论。

大家天天在用C,C++,Pascal,有没有想过这样一个问题:是否存在一个问题,我们可以给出算法,但是无法用这些语言编出程序来?

事实上,60年代的时候有一个牛人(名字忘记了,不过是图灵奖得主)就从理论上证明了所有的算法都可以用C语言描述出来,所有用C语言描述的程序都有算法。这样他提出了可计算性的一个新的定义——原来的定义是“能够用图灵机计算的叫做可计算的”,数学定义是“一般递归函数能描述的叫做可计算的”——这个牛人给出的定义是:“能够用C语言编出程序来的就叫做可计算的”。换句话说,我们不用担心这些程序设计语言能力不够强,以至于我们想到如何解决问题但是无法用C语言编出程序来。只要我们能够想到算法的问题,就可以写出C语言的程序;只要是C语言写出的程序,就有算法与之对应。这样,程序完全可以按照一定的算法自动生成!这是现在的软件科学追求的最高境界,以后大家只要告诉计算机你的算法,就可以自动编写程序。但是更高境界是只要告诉计算机要解决什么问题,计算机自己设计算法编写程序,不过这又牵涉到人工智能了。
至今为止程序自动生成还是梦想。不过这方面已经有很多进展了,如果对这方面感兴趣,可以看一些程序设计理论方面的书,那要比Vc,VB,delphi有趣得多:)

老土豆T 2001-07-20
  • 打赏
  • 举报
回复
就比如你要打印一个万年历。 要求你输入任何一个时间,电脑都会自动打印出他的日历表。。
(假社公元0年 1月1日是星期1)
要打印年份表,知道那一年第一天是星期几十分重要

那算法有很多,当然最笨的是用这一天和0年一月1日比较。。得到答案%7 余数+1就是这一天的星期数
(假设这个计算在最早期的16bit的计算机上算。 那么算2000年就要大约算 到2000X365那么大的整数, int 只有65535,显然他会益处,这种算法不可取)
略微好一点的算法则会这样算 (平均的话,一年就365%7=1,闰年的话就大2。)
((2000-0)+(2000-0)%4-(2000-0)%100+(2000-0)%400)%7

当然也可以用其他的算法,把他们搬到程序中去。举以下程序实例。
#include <stdio.h>
main()
{ int year=2000;
printf("please intput year:"); /* 输入年份 */
scanf("%d",&year);
if(year>0&&year<10000) prtab(year); /* 调用输出月历的函数*/
else printf("\nCan not output this year's table.");
}

int prtab(int year) /* 打印某年日历的函数 */
{int mounth;
int date;
date=dateofweek(year);
pryear(year);
for(mounth=1;mounth<=12;mounth++)
{printf("%d\n",mounth);
printf("---------------------------\n");
printf("sun mon tue wed thu fri sat\n");
printf("---------------------------\n");
date=moutp(year,mounth,date);
printf("---------------------------\n\n");
getch();
}
}

int pryear(int year) /* 打印用字符组成的年份 */
{char num[10][8][9]={
{" ###### ",
"# #",
"# #",
"# #",
"# #",
"# #",
"# #",
" ###### "},
{" # ",
" ## ",
" # ",
" # ",
" # ",
" # ",
" # ",
" ### "},
{" ###### ",
"# #",
"# #",
" # ",
" # ",
" # ",
" # ",
"########"},
{"########",
"# # ",
" # ",
" #### ",
" #",
" #",
"# #",
" ###### "},
{" # ",
" ## ",
" # # ",
" # # ",
"# # ",
"########",
" # ",
" ### "},
{"####### ",
"# ",
"####### ",
" #",
" #",
" #",
"# #",
" ###### "},
{" ###### ",
"# #",
"# ",
"####### ",
"# #",
"# #",
"# #",
" ###### "},
{"########",
"# # ",
" # ",
" # ",
" # ",
" # ",
" # ",
" # "},
{" ###### ",
"# #",
"# #",
" ###### ",
"# #",
"# #",
"# #",
" ###### "},
{" ###### ",
"# #",
"# #",
"# #",
" #######",
" #",
"# #",
" ###### "}
};
int x[4];
int i,j,k;
for(i=0;i<4;i++)
{x[i]=year%10;
year=year/10;
}
for(i=0;i<8;i++)
{for(j=3;j>=0;j--)
{for(k=0;k<8;k++) printf("%c",num[x[j]][i][k]);
printf(" ");
}
printf("\n");
}
}


int moutp(int year,int mounth,int date) /* 打印某年某月月历,date 是该月份的第一天是星期几 */
{int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int day,dates;
if (daysofyear(year)-365) days[1]=29;
for (dates=0;dates<date;dates++) printf(" ");
for (day=1;day<=days[mounth-1];day++)
{printf("%3d ",day);
dates++;
if (dates>=7)
{dates=0 ;
printf("\n");
}
}
printf("\n");
return dates;
}

int daysofyear(year) /* 计算出某年份的天数 */
{int days=0;
if (!(year%400)) days=366;
else if (!(year%100)) days=365;
else if (!(year%4)) days=366;
else days=365;
return days;
}

int dateofweek(int year) /* 计算出该年一月一日是星期几 */
{int y2k;
int day=6;
if (year>2000)
for (y2k=2000;y2k<year;y2k++) day=(day+daysofyear(y2k))%7;
else if (year<2000)
for (y2k=2000;y2k>year;y2k--) day=(7+day-daysofyear(y2k-1)%7)%7;
return day;
}
ljunfa 2001-07-19
  • 打赏
  • 举报
回复
非常高兴能看到你提的这个问题,我也一直在思考这个问题,我感觉有必要探索计算与编程之间的关系,说不定能够开辟一个新的数学方向,就比如当初计算数学发展起来一样,我们不妨称之为程序数学。如果将很多必然的东西作成程序中的定理,那么有些通过计算机循环做的事,也可以被作成定理,那样的话,有很多数学难题,也许迎刃而解了!
内容简介: 无论你是从事业务开发,还是从事架构设计,想要优化设计模式,数据结构与算法是必备的一门学科,本课程使用Java来讲解数据结构和算法,考虑到数据结构和算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。为什么学数据结构与算法算法是一个程序员真正的核心竞争力。无论用哪种语言做开发,算法程序角度而言都是灵魂内核般的存在。程序的躯体可以各式各样,但是内核一定要追求高效整洁。同时掌握了算法,大厂名企的Offer不再是梦寐以求的梦想,而让程序高效且健壮,也不再是难以完成的技术难题。所以无论是为提升自我内功修炼,还是提升程序灵魂内核健全,学习算法,都是现有可供选项里的最优解。课程大纲:为了让大家快速系统了解数据结构与算法知识全貌,我为你总结了「数据结构与算法框架图」,帮你梳理学习重点,建议收藏!! CSDN学院Java答疑群:

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧